Игнорировать неизвестные свойства в модели Swagger - PullRequest
0 голосов
/ 06 сентября 2018

Мы используем сгенерированный Swagger код для спокойного сервера и моделей, и проблема в том, что полезная нагрузка json может быть обновлена ​​новыми свойствами в любой момент, что приведет к ошибке.

Как правило, можно добавить @JsonIgnoreProperties(ignoreUnknown = true), чтобы игнорировать свойства, но в этом случае сгенерированная Swagger модель генерируется при каждой сборке (и доступна только для чтения).

Как настроить Swagger на игнорирование неизвестных свойств?

Ошибка образца:

Unrecognized field "abc" (class xyz.model.sample), not marked as ignorable ....

ОБНОВЛЕНИЕ на основе ответа Павла:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.annotation.Priority;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
@Priority(Integer.MIN_VALUE)
public class ObjectMapperResolver implements 
ContextResolver<ObjectMapper>{
  private ObjectMapper mapper;

  public ObjectMapperResolver() {
    mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 
    false);
  }

  @Override
  public ObjectMapper getContext(Class<?> cls) {
    return mapper;
  }

}

1 Ответ

0 голосов
/ 07 сентября 2018

Используйте ContextResolver для глобальной настройки ObjectMapper.Существует DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, который мы можем установить в false, чтобы сказать Джексону, чтобы он не беспокоился о неизвестных свойствах.

@Provider
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
    private ObjectMapper mapper;

    public ObjectMapperResolver() {
        mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> cls) {
        return mapper;
    }
}

Поставщик Jackson JAX-RS вызовет этот преобразователь, чтобы получитьObjectMapper, который он использует для десериализации.

Если вы используете сканирование для регистрации своих ресурсов и поставщиков, этот класс должен автоматически регистрироваться из-за аннотации @Provider.Если вы не используете сканирование, то вам необходимо убедиться, что вы зарегистрировали этот преобразователь, иначе он не будет использоваться.


Редактировать

Если кодовый код Swagger ужесоздавая ContextResolver, вы можете просто создать его в вашем преобразователе и получить ObjectMapper из этого преобразователя вместо создания вашего собственного преобразователя.Это гарантирует, что любые конфигурации для ObjectMapper, сделанные в сгенерированном преобразователе, все еще вступают в силу.Затем добавьте @Priority(Integer.MIN_VALUE) к классу, чтобы он гарантированно использовался поверх сгенерированного, если сгенерированный также будет зарегистрирован.

@Provider
@Priority(Integer.MIN_VALUE)
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
    private ObjectMapper mapper;

    public ObjectMapperResolver() {
        JSON swaggerResolver = new JSON(); 
        mapper = swaggerResolver.getContext(null);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> cls) {
        return mapper;
    }
}
...