如何在使用依赖关系在jar中定义另一个对象映射器的情况下如何使对象映射器正常工作?使用ObjectMapper添加JAR使得我的ObjectMapper不可发现
我正在尝试使用Swagger和Jersey 2,它正在Jetty下运行。问题是,只要我将Swagger JAX-RX jar添加到类路径中,我的对象映射器就没有被发现,因此我失去了我的对象的自定义序列化。
这里是我的对象映射如何定义
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
我已经发布了issue招摇的维护者,你可以阅读细节。
经过几小时的泽西内部调试后,我发现Swagger自己的对象映射器com.wordnik.swagger.jaxrs.json.JacksonJsonProvider调用super.setMapper(commonMapper)
,它将非空值设置为ProviderBase._mapperConfig._mapper
。后来,当HTTP请求处理程序试图序列我类别的呼叫例如在ProviderBase.locateMapper
结束了已在正确的代码流_mapperConfig.getConfiguredMapper()
返回空随后引起_locateMapperViaProvider
指找到我的自定义映射器调用以下机身
public MAPPER locateMapper(Class<?> type, MediaType mediaType)
{
// First: were we configured with a specific instance?
MAPPER m = _mapperConfig.getConfiguredMapper();
if (m == null) {
// If not, maybe we can get one configured via context?
m = _locateMapperViaProvider(type, mediaType);
if (m == null) {
// If not, let's get the fallback default instance
m = _mapperConfig.getDefaultMapper();
}
}
return m;
}
。使用Swagger它默认为com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator
,我的自定义json序列化程序永远不会被调用。
我创建了一个再现此问题的小项目here。
你们会建议如何解决这个问题?我可以在TTLocalDate
类型的每个属性上指定反序列化器,但它会污染代码:(