복붙노트

[SPRING] Spring @ResponseBody Jackson JsonSerializer with JodaTime

SPRING

Spring @ResponseBody Jackson JsonSerializer with JodaTime

나는 JodaTime 처리를 위해 Serializer 아래에있다 :

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {

    private static final String dateFormat = ("MM/dd/yyyy");

    @Override
    public void serialize(DateTime date, JsonGenerator gen, SerializerProvider provider)
            throws IOException, JsonProcessingException {

        String formattedDate = DateTimeFormat.forPattern(dateFormat).print(date);

        gen.writeString(formattedDate);
    }

}

그런 다음 각 모델 객체에서이 작업을 수행합니다.

@JsonSerialize(using=JodaDateTimeJsonSerializer.class )
public DateTime getEffectiveDate() {
    return effectiveDate;
}

위 설정으로 @ResponseBody와 Jackson Mapper가 올바르게 작동합니다. 그러나, 나는 @JsonSerialize를 계속 쓰고있는 생각을 좋아하지 않는다. 필요한 것은 모델 객체에 @JsonSerialize가없는 솔루션입니다. 이 구성을 spring xml 어딘가에 하나의 설정으로 쓸 수 있습니까?

당신의 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.각 날짜 필드에 대해 주석을 달 수 있지만 개체 매퍼에 대한 전역 구성을 수행하는 것이 좋습니다. jackson을 사용하면 다음과 같이 스프링을 구성 할 수 있습니다.

    각 날짜 필드에 대해 주석을 달 수 있지만 개체 매퍼에 대한 전역 구성을 수행하는 것이 좋습니다. jackson을 사용하면 다음과 같이 스프링을 구성 할 수 있습니다.

    <bean id="jacksonObjectMapper" class="com.company.CustomObjectMapper" />
    
    <bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
        factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" >
    </bean>
    

    사용자 정의 ObjectMapper의 경우 :

    public class CustomObjectMapper extends ObjectMapper {
    
        public CustomObjectMapper() {
            super();
            configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
            setDateFormat(new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)"));
        }
    }
    

    물론 SimpleDateFormat은 필요한 모든 형식을 사용할 수 있습니다.

  2. ==============================

    2.@Moesio는 거의 그것을 얻었다. 내 설정은 다음과 같습니다.

    @Moesio는 거의 그것을 얻었다. 내 설정은 다음과 같습니다.

    <!-- Configures the @Controller programming model -->
    <mvc:annotation-driven/>
    
    <!-- Instantiation of the Default serializer in order to configure it -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterConfigurer" init-method="init">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="objectMapper" ref="jacksonObjectMapper" />
                </bean>
            </list>
        </property>
    </bean>
    
    <bean id="jacksonObjectMapper" class="My Custom ObjectMapper"/>
    
    <bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
        factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />
    

    나를 잡아 먹는 비트는 가 자신의 AnnotationMethodHandler를 만들고 수동으로 만든 것을 무시한다는 것입니다. http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html에서 BeanPostProcessing 아이디어를 얻었습니다.이 아이디어는 사용되는 것을 구성하고 보일 것입니다! 매력처럼 작동합니다.

  3. ==============================

    3.Spring 3의 JavaConfig를 사용하는 것과 동일합니다.

    Spring 3의 JavaConfig를 사용하는 것과 동일합니다.

    @Configuration
    @ComponentScan()
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter
    {
    
        @Override
        public void configureMessageConverters(final List<HttpMessageConverter<?>> converters)
        {
            converters.add(0, jsonConverter());
        }
    
        @Bean
        public MappingJacksonHttpMessageConverter jsonConverter()
        {
            final MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
            converter.setObjectMapper(new CustomObjectMapper());
    
            return converter;
        }
    }
    
  4. ==============================

    4.Spring Boot를 사용하고 있다면, application.yml에서 이것을 시도하십시오 :

    Spring Boot를 사용하고 있다면, application.yml에서 이것을 시도하십시오 :

    spring:
        jackson:
           date-format: yyyy-MM-dd
           time-zone: Asia/Shanghai
           joda-date-time-format: yyyy-MM-dd
    
  5. ==============================

    5.클래스 패스에 Jackson JAR 만 가지고 @ResponseBody를 반환하면 Spring은 Model 객체를 JSON으로 자동 변환합니다. 모델을 작동 시키려면 모델에 주석을 달 필요가 없습니다.

    클래스 패스에 Jackson JAR 만 가지고 @ResponseBody를 반환하면 Spring은 Model 객체를 JSON으로 자동 변환합니다. 모델을 작동 시키려면 모델에 주석을 달 필요가 없습니다.

  6. from https://stackoverflow.com/questions/10649356/spring-responsebody-jackson-jsonserializer-with-jodatime by cc-by-sa and MIT license