Невозможно отфильтровать и настроить атрибуты ответа на атрибуты внутри вложенного документа. - PullRequest
0 голосов
/ 26 июня 2019

У меня следующий json:

{
"managedObject": {
"uid": "00c7a5ac-5653-3ed6-9cf6-667d0258ceae",
"attributes": {
   "vsDataEUtranCellRelation": { 
              "amoState": "ENABLED"
}}}}

В моем запросе API: http://localhost:9091/naas/v1/mos/00c7a5ac-5653-3ed6-9cf6-667d0258ceae?fields=uid%2Cattributes.vsDataEUtranCellRelation.amoState&links=false

пользователь может указать поля, которые он хочет вернуть. В этом примере:

  1. 1010 * UID *
  2. attributes.vsDataEUtranCellRelation.amoState

результат для этого запроса:

"managedObject": {
"uid": "00c7a5ac-5653-3ed6-9cf6-667d0258ceae",
"attributes": {}
}}

без: attribute.vsDataEUtranCellRelation.amoState

когда я пытаюсь выполнить этот запрос: http://localhost:9091/naas/v1/mos/00c7a5ac-5653-3ed6-9cf6-667d0258ceae?fields=uid%2Cattributes.vsDataEUtranCellRelation&links=false

с полями:

  1. UID
  2. attributes.vsDataEUtranCellRelation

ответ:

{
"managedObject": {
"uid": "00c7a5ac-5653-3ed6-9cf6-667d0258ceae",
"attributes": {
"vsDataEUtranCellRelation": {
"amoState": "ENABLED",
"eUtranCellRelationId": "024886_1_2",
"eranExternalUlCompGroupAvail": "ENABLED",
"ieNBUlCompCoopCellAllowed": "true",
"includeInSystemInformation": "true",
"isHoAllowed": "true",
"isRemoveAllowed": "false",
"lbCovIndicated": "false",
"neighborCellRef": "3",
"qOffsetCellEUtran": "0",
"sleepModeCovCellCandidate": "AUTO",
"sleepModeCoverageCell": "false"
}}}}

код, отвечающий за обработку запроса фильтра:

public class RestResponseFilter extends AbstractMappingJacksonResponseBodyAdvice {

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RestResponseIncludes {
        String fields();
    }

    public static final String FILTER_ID = "RestResponseFilter";
    public static final String PARAM_NAME = "fields";
    private static final String LEAN_REPRESENTATION = "__LEAN_OBJECT__";
    private static final String DELIMITER = ",";

    @Override
    protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer,
                                           org.springframework.http.MediaType contentType, MethodParameter returnType,
                                           ServerHttpRequest request, ServerHttpResponse response) {
        if (bodyContainer.getFilters() != null ) {
            return;
        }
        HttpServletRequest baseReq = ((ServletServerHttpRequest) request).getServletRequest();
        String include = baseReq.getParameter(PARAM_NAME);
        PropertyFilter filter = SimpleBeanPropertyFilter.serializeAll();

        if (include != null && !include.isEmpty()) {
            if (include.contains(LEAN_REPRESENTATION)) {
                Object temp = bodyContainer.getValue();
                if (temp instanceof Collection){
                    temp = ((Collection) temp).stream().findAny().orElse(null);
                }
                if (temp != null) {                 
                    RestResponseIncludes restResponseIncludes = temp.getClass().getAnnotation(RestResponseIncludes.class);
                    if (restResponseIncludes != null) {
                        String mandatory = restResponseIncludes.fields();
                        if (mandatory != null && !mandatory.isEmpty()) {
                            include = include.replace(LEAN_REPRESENTATION, mandatory);
                        }
                    }
                }

            }
            String[] attrs = include.split(DELIMITER);
            filter = RestBeanPropertyFilter.filterOutAllExcept(attrs);
        }
        bodyContainer.setFilters(new SimpleFilterProvider().addFilter(FILTER_ID, filter));
    }
}

Есть идеи, что мне не хватает, чтобы включить фильтрацию для сложного поддокумента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...