[SPRING] Spring 3.2 및 Jackson 2 : 사용자 정의 객체 매퍼 추가
SPRINGSpring 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.해당 모델 필드에 @JsonSerialize 주석을 주석으로 지정해야합니다. 귀하의 경우에는 다음과 같을 수 있습니다 :
해당 모델 필드에 @JsonSerialize 주석을 주석으로 지정해야합니다. 귀하의 경우에는 다음과 같을 수 있습니다 :
public class MyMongoModel{ @JsonSerialize(using=ObjectIdSerializer.class) private ObjectId id; }
그러나 제 생각에는 엔티티 모델을 VO로 사용하지 않는 것이 좋습니다. 더 좋은 방법은 서로 다른 모델과지도를 만드는 것입니다. 내 예제 프로젝트를 여기서 찾을 수 있습니다 (스프링 3과 잭슨 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.오브젝트 맵퍼를 작성할 필요가 없습니다. 프로젝트에 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)
특수 효과를 놓치지 마십시오.
from https://stackoverflow.com/questions/14363555/spring-3-2-and-jackson-2-add-custom-object-mapper by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Autowired HttpServletResponse (0) | 2019.02.10 |
---|---|
[SPRING] 어떤 JAR 파일에 JsonProcessingException 클래스가 포함되어 있습니까? (0) | 2019.02.10 |
[SPRING] 사양 클래스 외부에서 Spock 모의 객체를 만드는 방법은 무엇입니까? (0) | 2019.02.10 |
[SPRING] Thymeleaf : URL 속성 값을 얻는 방법 (0) | 2019.02.10 |
[SPRING] 봄 부팅 1.3.0 지원 최대 절전 모드 5? (0) | 2019.02.10 |