基于Jersey 2.6中实际解决的other issues,我怀疑这可能是Jersey的错误,但是我想先在这里进行审查。
预期的工作如下:
@Provider
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
private ObjectMapper mapper;
@Value("${json.prettyPrint}")
private boolean prettyPrint = false;
public ObjectMapperResolver() {
mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(SerializationFeature.INDENT_OUTPUT, prettyPrint);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
/**
* Push Joda de/serializers into the actual mapper
*/
@PostConstruct
private void configureJodaSerializers() {
mapper.registerModule(new JodaModule()
// Our deserializers are more forgiving
.addDeserializer(LocalDate.class, new CustomLocalDateDeserializer())
.addDeserializer(LocalTime.class, new CustomLocalTimeDeserializer())
// Custom serializer to avoid HH:mm:ss.SSS (we don't want millis)
.addSerializer(LocalTime.class, new LocalTimeSerializer()));
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
在我所有的资源中,我的Joda日期类型已正确序列化。但是,我想在非Jersey托管上下文中(在我的资源之外)使用相同的
ObjectMapper
,因此我在上述类中添加了@Component
,目的是将其自动连接到其他地方。添加@Component
(org.springframework.stereotype.Component)后,Jersey不再从解析器中获取ObjectMapper,而我的日期序列化又恢复为默认值。除非我完全误解了注释,否则我认为让Spring控制生命周期不会妨碍Jersey拾取我的解析器的能力。另外值得注意的是,当我们使用Jersey 1.9时,我们必须在其中安装
@Component
,否则它将不会被拾取。为了使我们的版本从1.9升级到2.6,实际上我最初已将其删除,但希望将其放回原处。从我的pom:
Java 1.7
杰克逊2.3.1
球衣2.6
乔达2.1
Spring 4.0.1-发布
最佳答案
我有一个similar issue,其设置与您的设置相似。
虽然Jersey 2.x Spring集成行为可能存在问题,但我认为您可以执行以下操作:
将对象映射器声明为Spring bean,因此可以在需要的地方通过spring注入它:
@Component
public class ObjectMapperBean extends ObjectMapper {
public ObjectMapperBean() {
super();
// Configuration here...
}
}
然后为它编写一个Jersey上下文解析器:
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
@Autowired
private ObjectMapperBean objectMapper;
@Override
public ObjectMapper getContext(Class<?> type) {
return objectMapper;
}
}
即使未声明为组件,您也会在其中注入ObjectMapperBean。
希望能帮助到你!