Added custom JAX RS Filter priorities

This commit is contained in:
Philipp Czora
2018-06-22 13:47:47 +02:00
parent b95066946e
commit 2ad4b14fb0
3 changed files with 26 additions and 9 deletions

View File

@@ -3,14 +3,12 @@ package sonia.scm.api.v2;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import javax.annotation.Priority; import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.Provider;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -19,14 +17,14 @@ import static java.util.Collections.emptyList;
import static java.util.Optional.ofNullable; import static java.util.Optional.ofNullable;
/** /**
* <p>Post processor for rest requests filtering json responses when a {@value PARAMETER_FIELDS} query * <p>Post processor for REST requests filtering JSON responses when a {@value PARAMETER_FIELDS} query
* parameter is provided. In this case, only the given fields will returned. It is possible, to specify * parameter is provided. In this case, only the given fields will returned. It is possible to specify
* paths for nested fields. Multiple fields have to be devided using {@value FIELD_SEPARATOR}.</p> * paths for nested fields. Multiple fields have to be separated using {@value FIELD_SEPARATOR}.</p>
* <p>This requires the {@link JsonMarshallingResponseFilter} to be processed first to create * <p>This requires the {@link JsonMarshallingResponseFilter} to be processed first to create
* the {@link JsonNode} tree.</p> * the {@link JsonNode} tree.</p>
*/ */
@Provider @Provider
@Priority(Priorities.USER) @Priority(FilterPriorities.FIELD_FILTER)
public class FieldContainerResponseFilter implements ContainerResponseFilter { public class FieldContainerResponseFilter implements ContainerResponseFilter {
private static final String PARAMETER_FIELDS = "fields"; private static final String PARAMETER_FIELDS = "fields";

View File

@@ -0,0 +1,20 @@
package sonia.scm.api.v2;
import javax.ws.rs.Priorities;
/**
* A collection of filter priorities used by custom {@link javax.ws.rs.container.ContainerResponseFilter}s.
*/
final class FilterPriorities {
/**
* Other filters depend on already marshalled {@link com.fasterxml.jackson.databind.JsonNode} trees. Thus, JSON
* marshalling has to happen before those filters
*/
static final int JSON_MARSHALLING = Priorities.USER + 1000;
static final int FIELD_FILTER = JSON_MARSHALLING - 1000;
private FilterPriorities() {
}
}

View File

@@ -8,7 +8,6 @@ import sonia.scm.web.VndMediaType;
import javax.annotation.Priority; import javax.annotation.Priority;
import javax.inject.Inject; import javax.inject.Inject;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.ContainerResponseFilter;
@@ -16,11 +15,11 @@ import javax.ws.rs.ext.Provider;
import java.util.Set; import java.util.Set;
/** /**
* Transforms json rest responses to {@link JsonNode} trees to support further post processing * Transforms JSON REST responses to {@link JsonNode} trees to support further post processing
* and processes all registered plugins for the {@link JsonEnricher} extension point. * and processes all registered plugins for the {@link JsonEnricher} extension point.
*/ */
@Provider @Provider
@Priority(Priorities.USER + 1000) @Priority(FilterPriorities.JSON_MARSHALLING)
public class JsonMarshallingResponseFilter implements ContainerResponseFilter { public class JsonMarshallingResponseFilter implements ContainerResponseFilter {
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;