2013-01-16 5 views
14

스프링 MVC에서 REST 웹 서비스를 개발 중입니다. 잭슨 2가 mongodb 오브젝트 ID를 직렬화하는 방법을 변경해야합니다.스프링 3.2 및 잭슨 2 : 사용자 정의 객체 매퍼 추가

public class ObjectIdSerializer extends JsonSerializer<ObjectId> { 


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

public class CustomObjectMapper extends ObjectMapper { 

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

} 

을 ObjectMapper를 만든 다음 매퍼를 등록 : 나는 잭슨 2 부분 문서를 발견하기 때문에 무엇을 해야할지 모르겠어요, 제가 한 일은 사용자 지정 serializer를 만드는 것입니다

<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를 사용하고 있습니다. 어디에서 잘못 했습니까? 덕분에 내가 이런 짓을 했을까 방법

+2

Serializer 및 등록이 내게 맞아 보이므로 문제는 XML 구성에 있다고 생각합니다. – StaxMan

+1

그래, 제안 주셔서 감사합니다, 나는 파일 주위에 빈 태그가 있습니다. 이제 작동 중입니다 – alex

+0

참고로 StdSerializer 대신 StdSerializer를 사용하는 것이 좋습니다. http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/ser/std/StdSerializer.html – testing123

답변

0

은 다음과 같습니다

사용자 정의 시리얼 선언 주석을 만들기 : 당신의 mvcconfiguration 파일에 이에 대한

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

설정 구성 요소 검사를

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

HttpMessageConverter<T>을 구현하는 클래스를 만듭니다.

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

extends AnnotationMethodHandlerAdapter implements 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. 
    } 

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

건배.

+0

나는 당신이 이것에 관해 가고있는 길을 믿는다, "저지 방법"의 안에서 많이이다. – ninnemannk

+0

이 답변에는 너무 많은 불필요한 복잡성이 있습니다. OP가 올바른 방식으로하고 있습니다. – Bart

2

해당 모델 필드에 @JsonSerialize 알림으로 주석을 추가해야합니다.

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

을하지만 내 생각에, 더 나은 VO로 같은 개체 모델을 사용하지 않는해야합니다 귀하의 경우가있을 수 있습니다. 더 좋은 방법은 서로 다른 모델과지도를 만드는 것입니다. my example project here (예 : 스프링 3과 잭슨 2의 날짜 직렬화를 예로 사용)을 찾을 수 있습니다.

0

개체 매퍼를 만들 필요가 없습니다. 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) 

은 주석 중 하나를 놓치지 마십시오.

관련 문제