使用 ObjectMapper 添加 JAR 会使我的 ObjectMapper 不可发现
Adding JAR with ObjectMapper makes my ObjectMapper non-discoverable
当依赖项中的 jar 中定义了另一个对象映射器时,如何使我的对象映射器工作?
我正在尝试使用 Jetty 下 运行 的 Swagger with Jersey 2。问题是,一旦我将 Swagger JAX-RX jar 添加到 classpath 中,我的对象映射器就没有被发现,因此我失去了我的对象的自定义序列化。
这是我的对象映射器的定义方式
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
我已将 issue 发布给 Swagger 的维护者,您可以在其中阅读详细信息。
在 Jersey 内部调试数小时后,我发现 Swagger 自己的对象映射器 com.wordnik.swagger.jaxrs.json.JacksonJsonProvider 调用 super.setMapper(commonMapper)
将非空值设置为 ProviderBase._mapperConfig._mapper
。稍后当 http 请求处理程序尝试序列化我的 class 调用的实例时,最终在 ProviderBase.locateMapper
中结束,其中包含以下主体
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;
}
在正确的代码流中 _mapperConfig.getConfiguredMapper()
returns null 随后导致调用 _locateMapperViaProvider
找到我的自定义映射器。使用 Swagger,它默认为 com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator
,而我的自定义 json 序列化程序永远不会被调用。
我创建了重现此问题的小项目here。
你们建议如何解决这个问题?我可能可以在 TTLocalDate
类型的每个 属性 上指定反序列化器,但它会污染代码:(
正如 fehguy 在问题报告中指出的那样,使用最新的 Swagger 版本并使用 SwaggerSerializers
应该可以解决此问题。以前 Swagger JacksonJsonProvider
将用于 all 序列化,SwaggerSerializers
是 only used for the Swagger
model object
public class SwaggerSerializers implements MessageBodyWriter<Swagger> {
@Override
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return Swagger.class.isAssignableFrom(type);
}
当依赖项中的 jar 中定义了另一个对象映射器时,如何使我的对象映射器工作?
我正在尝试使用 Jetty 下 运行 的 Swagger with Jersey 2。问题是,一旦我将 Swagger JAX-RX jar 添加到 classpath 中,我的对象映射器就没有被发现,因此我失去了我的对象的自定义序列化。
这是我的对象映射器的定义方式
@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
}
我已将 issue 发布给 Swagger 的维护者,您可以在其中阅读详细信息。
在 Jersey 内部调试数小时后,我发现 Swagger 自己的对象映射器 com.wordnik.swagger.jaxrs.json.JacksonJsonProvider 调用 super.setMapper(commonMapper)
将非空值设置为 ProviderBase._mapperConfig._mapper
。稍后当 http 请求处理程序尝试序列化我的 class 调用的实例时,最终在 ProviderBase.locateMapper
中结束,其中包含以下主体
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;
}
在正确的代码流中 _mapperConfig.getConfiguredMapper()
returns null 随后导致调用 _locateMapperViaProvider
找到我的自定义映射器。使用 Swagger,它默认为 com.fasterxml.jackson.jaxrs.json.JsonMapperConfigurator
,而我的自定义 json 序列化程序永远不会被调用。
我创建了重现此问题的小项目here。
你们建议如何解决这个问题?我可能可以在 TTLocalDate
类型的每个 属性 上指定反序列化器,但它会污染代码:(
正如 fehguy 在问题报告中指出的那样,使用最新的 Swagger 版本并使用 SwaggerSerializers
应该可以解决此问题。以前 Swagger JacksonJsonProvider
将用于 all 序列化,SwaggerSerializers
是 only used for the Swagger
model object
public class SwaggerSerializers implements MessageBodyWriter<Swagger> {
@Override
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return Swagger.class.isAssignableFrom(type);
}