Jersey 2.6,Spring 4:使用@Component的Context Resolver不起作用

时间:2014-02-28 18:10:31

标签: java spring jersey jersey-2.0

根据在Jersey 2.6中实际解决的other issues,我怀疑这可能是泽西岛的一个bug,但我想先在这里审核。

以下按预期方式工作:

@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 1.9上时,我们必须在那里@Component,否则就不会被选中。为了让我们从1.9升级到2.6工作,我实际上已经删除了它,但希望能够把它恢复。

从我的pom:

  • Java 1.7
  • Jackson 2.3.1
  • 泽西岛2.6
  • Joda 2.1
  • Spring 4.0.1-RELEASE

1 个答案:

答案 0 :(得分:3)

我的similar issue设置与您的设置类似。 虽然Jersey 2.x Spring集成beahviour可能出现了问题,但我认为你可以做到以下几点:

将对象映射器声明为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。

希望它有所帮助!