diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java index 677d5d955e..f66621e367 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/FieldContainerResponseFilter.java @@ -3,14 +3,12 @@ package sonia.scm.api.v2; import com.fasterxml.jackson.databind.JsonNode; import javax.annotation.Priority; -import javax.ws.rs.Priorities; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; import java.util.Collection; -import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -19,14 +17,14 @@ import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; /** - *

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 - * paths for nested fields. Multiple fields have to be devided using {@value FIELD_SEPARATOR}.

+ *

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 + * paths for nested fields. Multiple fields have to be separated using {@value FIELD_SEPARATOR}.

*

This requires the {@link JsonMarshallingResponseFilter} to be processed first to create * the {@link JsonNode} tree.

*/ @Provider -@Priority(Priorities.USER) +@Priority(FilterPriorities.FIELD_FILTER) public class FieldContainerResponseFilter implements ContainerResponseFilter { private static final String PARAMETER_FIELDS = "fields"; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/FilterPriorities.java b/scm-webapp/src/main/java/sonia/scm/api/v2/FilterPriorities.java new file mode 100644 index 0000000000..96ed8f0891 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/FilterPriorities.java @@ -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() { + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java index c0d9904fda..a1e571aa34 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java @@ -8,7 +8,6 @@ import sonia.scm.web.VndMediaType; import javax.annotation.Priority; import javax.inject.Inject; -import javax.ws.rs.Priorities; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; @@ -16,11 +15,11 @@ import javax.ws.rs.ext.Provider; 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. */ @Provider -@Priority(Priorities.USER + 1000) +@Priority(FilterPriorities.JSON_MARSHALLING) public class JsonMarshallingResponseFilter implements ContainerResponseFilter { private final ObjectMapper objectMapper;