복붙노트

[SPRING] Spring 3.2 및 Jackson 2 : 사용자 정의 객체 매퍼 추가

SPRING

Spring 3.2 및 Jackson 2 : 사용자 정의 객체 매퍼 추가

나는 스프링 MVC에서 REST 웹 서비스를 개발 중이다. 잭슨 2가 mongodb 오브젝트 ID를 직렬화하는 방법을 변경해야합니다. 내가 잭슨 2에 대한 부분적인 문서를 찾았 기 때문에 무엇을해야할지 모르겠다. 내가 한 것은 커스텀 시리얼 라이저를 만드는 것이다.

public class ObjectIdSerializer extends JsonSerializer<ObjectId> {


    @Override
    public void serialize(ObjectId value, JsonGenerator jsonGen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jsonGen.writeString(value.toString());
    }
}

ObjectMapper 만들기

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        SimpleModule module = new SimpleModule("ObjectIdmodule");
        module.addSerializer(ObjectId.class, new ObjectIdSerializer());
        this.registerModule(module);
    }

}

매퍼 등록

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="my.package.CustomObjectMapper"></bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

내 CustomConverter는 호출되지 않습니다. CustomObjectMapper 정의가 잘못되었다고 생각합니다. 잭슨 1.x의 코드에서이 코드를 적용했습니다.

내 컨트롤러에서 @ResponseBody를 사용하고 있습니다. 내가 어디에서 잘못하고 있니? 감사

해결법

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

    1.해당 모델 필드에 @JsonSerialize 주석을 주석으로 지정해야합니다. 귀하의 경우에는 다음과 같을 수 있습니다 :

    해당 모델 필드에 @JsonSerialize 주석을 주석으로 지정해야합니다. 귀하의 경우에는 다음과 같을 수 있습니다 :

    public class MyMongoModel{
       @JsonSerialize(using=ObjectIdSerializer.class)
       private ObjectId id;
    }
    

    그러나 제 생각에는 엔티티 모델을 VO로 사용하지 않는 것이 좋습니다. 더 좋은 방법은 서로 다른 모델과지도를 만드는 것입니다. 내 예제 프로젝트를 여기서 찾을 수 있습니다 (스프링 3과 잭슨 2에서 날짜 직렬화를 예제로 사용했습니다).

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

    2.내가 이것을 어떻게 할 것인가 :

    내가 이것을 어떻게 할 것인가 :

    사용자 정의 serializer를 선언하는 주석을 작성하십시오.

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyMessageConverter{
    }
    

    mvcconfiguration 파일에서 이에 대한 구성 요소 검사를 설정하십시오.

    <context:include-filter expression="package.package.MyMessageConverter"
                type="annotation" />
    

    HttpMessageConverter 를 구현하는 클래스를 만듭니다.

    @MyMessageConverter
    public MyConverter implements HttpMessageConverter<T>{
    //do everything that's required for conversion.
    }
    

    AnnotationMethodHandlerAdapter를 확장하는 클래스를 작성하면 (자), InitializingBean가 구현됩니다.

        public MyAnnotationHandler extends AnnotationMethodHandlerAdapter implements InitializingBean{
        //Do the stuffs you need to configure the converters
        //Scan for your beans that have your specific annotation
        //get the list of already registered message converters
        //I think the list may be immutable. So, create a new list, including all of the currently configured message converters and add your own. 
        //Then, set the list back into the "setMessageConverters" method.
        }
    

    나는 이것이 당신의 목표에 필요한 모든 것이라고 믿습니다.

    건배.

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

    3.오브젝트 맵퍼를 작성할 필요가 없습니다. 프로젝트에 jackson-core-2.0.0.jar 및 jackson-annotations-2.0.0.jar를 추가하십시오.

    오브젝트 맵퍼를 작성할 필요가 없습니다. 프로젝트에 jackson-core-2.0.0.jar 및 jackson-annotations-2.0.0.jar를 추가하십시오.

    이제 서비스를 전달하는 동안 컨트롤러에 다음 코드 줄을 추가하십시오.

    @RequestMapping(value = "students", method = RequestMethod.POST, headers = "Accept=application/json", consumes = "application/json")
    
    public HashMap<String, String> postStudentForm(
                @RequestBody Student student, HttpServletResponse response)
    

    특수 효과를 놓치지 마십시오.

  4. from https://stackoverflow.com/questions/14363555/spring-3-2-and-jackson-2-add-custom-object-mapper by cc-by-sa and MIT license