忽略Swagger模型中的未知属性

时间:2018-09-06 15:37:44

标签: java jax-rs swagger

我们将Swagger生成的代码用于宁静的服务器和模型,问题是json负载可以随时通过新属性进行更新,这将导致错误。

通常,可以添加@JsonIgnoreProperties(ignoreUnknown = true)来忽略属性,但是在这种情况下,每个版本都会生成Swagger生成的模型(并且是只读的)。

如何设置Swagger模型以忽略未知属性?

示例错误:

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

根据Paul的回复进行更新:

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 :(得分:1)

使用ContextResolver全局配置ObjectMapper。我们可以将DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES设置为false,以告诉Jackson不必担心未知属性。

@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,则只需在您的解析器中实例化它,然后从 that < / em>解析器,而不是创建自己的映射器。这样可以确保在生成的解析器中对ObjectMapper进行的任何配置仍然有效。然后将ObjectMapper添加到该类中,这样就可以保证在生成的生成器中也要使用它,如果生成的生成器也被注册了。

@Priority(Integer.MIN_VALUE)