我们将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;
}
}
答案 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)