RestTemplate를 사용할 때 내부 잭슨 매퍼를 설정하려면 어떻게 해야 합니까?
Serialization Config를 업데이트하고 싶습니다.기능...Spring RestTemplate에서 사용되는 잭슨 맵퍼 속성, 접근 방법 또는 설정 가능/필요한 장소.
디폴트RestTemplate컨스트럭터는 1세트를 등록한다.HttpMessageConverters:
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter());
this.messageConverters.add(new SourceHttpMessageConverter());
this.messageConverters.add(new XmlAwareFormHttpMessageConverter());
if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jacksonPresent) {
this.messageConverters.add(new MappingJacksonHttpMessageConverter());
}
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
그MappingJacksonHttpMessageConverter차례대로, 작성ObjectMapper직접 인스턴스화.이 변환기를 찾아서ObjectMapper또는 그 전에 새로운 것을 등록합니다.이 조작은 유효합니다.
@Bean
public RestOperations restOperations() {
RestTemplate rest = new RestTemplate();
//this is crucial!
rest.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());
return rest;
}
@Bean
public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(myObjectMapper());
return converter;
}
@Bean
public ObjectMapper myObjectMapper() {
//your custom ObjectMapper here
}
XML 에서는, 다음의 행에 준거하고 있습니다.
<bean id="restOperations" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<util:list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="customObjectMapper"/>
</bean>
</util:list>
</property>
</bean>
<bean id="customObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>
이행은 실제로는 1:1이 아닙니다.명시적으로 작성해야 합니다.messageConverters를 사용하는 동안 XML로 표시@Configuration기존 접근 방식을 참조하여 간단히 수정할 수 있습니다.하지만 이건 먹혀들거야
Spring IOC를 사용하지 않는 경우 다음과 같은 작업을 수행할 수 있습니다(Java 8).
ObjectMapper objectMapper = new ObjectMapper();
// configure your ObjectMapper here
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setPrettyPrint(false);
messageConverter.setObjectMapper(objectMapper);
restTemplate.getMessageConverters().removeIf(m -> m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
restTemplate.getMessageConverters().add(messageConverter);
RestTemplate는 기본 메시지 변환기를 초기화합니다.를 교환해 주세요.MappingJackson2HttpMessageConverter원하는 오브젝트 맵퍼를 사용할 수 있습니다.이 방법은 효과가 있었습니다.
@Bean
public RestTemplate restTemplate() {
final RestTemplate restTemplate = new RestTemplate();
//find and replace Jackson message converter with our own
for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {
final HttpMessageConverter<?> httpMessageConverter = restTemplate.getMessageConverters().get(i);
if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter){
restTemplate.getMessageConverters().set(i, mappingJackson2HttpMessageConverter());
}
}
return restTemplate;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(myObjectMapper());
return converter;
}
@Bean
public ObjectMapper myObjectMapper() {
// return your own object mapper
}
다른 답변을 작성하려면:ObjectMapper잭슨은 등록만 하면Module커스텀 시리얼라이저/디시리얼라이저를 사용하는 경우 기존 모듈에 직접 등록할 수 있습니다.ObjectMapper부터RestTemplate의 디폴트MappingJackson2HttpMessageConverter다음과 같습니다(예: DI를 사용하지 않지만 DI를 사용하는 경우에도 마찬가지).
SimpleModule module = new SimpleModule();
module.addSerializer(...);
module.addDeserializer(...);
MappingJackson2HttpMessageConverter messageConverter = restTemplate.getMessageConverters().stream()
.filter(MappingJackson2HttpMessageConverter.class::isInstance)
.map(MappingJackson2HttpMessageConverter.class::cast)
.findFirst().orElseThrow( () -> new RuntimeException("MappingJackson2HttpMessageConverter not found"));
messageConverter.getObjectMapper().registerModule(module);
그러면 원본 구성을 완료할 수 있습니다.ObjectMapper(스프링의 경우와 마찬가지로)Jackson2ObjectMapperBuilder를 교환하지 않고, 을 참조해 주세요.
스프링 부트를 사용하면 다음과 같이 간단합니다.
RestTemplate template = new RestTemplateBuilder()
.additionalMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper))
.build()
(스프링 부트 2.2.1로 테스트 완료)
언급URL : https://stackoverflow.com/questions/9381665/how-can-we-configure-the-internal-jackson-mapper-when-using-resttemplate
'programing' 카테고리의 다른 글
| 브라우저는 언제 Javascript를 실행합니까?실행 커서는 어떻게 이동합니까? (0) | 2023.03.06 |
|---|---|
| Spring Cloud Eureka Server 자체 보존 및 갱신 임계값 이해 (0) | 2023.03.06 |
| 어떻게 하면 ng-view가 아닌 ui-view에서 ng-animate를 사용할 수 있나요? (0) | 2023.03.06 |
| Redx 상태 및 URL 해시 태그 매개 변수를 동기화하는 방법 (0) | 2023.03.06 |
| 테마와 플러그인을 로드하지 않고 WordPress WP-API를 더 빠르게 만듭니다. (0) | 2023.03.06 |