XML에 대한 요청 및 응답 처리

현재까지 우리는 json , html 관련 요청 및 응답처리만 해왔는데 이번에는 xml 관련처리에 대해서 알아보자

일단 message converter 를 사용해야 되니 인터페이스를 정의해보자.

public interface HttpMessageConverter<T> {

    boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);

    boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

    List<MediaType> getSupportedMediaTypes();

    T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;

    void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;

}

이미 다들 알고 있었지만 Http 요청의 content-Type은 다양하다. xml로 전화하려면 해당 converter 를 사용해야 된다. SpringMVC는 기본적으로 Jackson 으로 구현 된 MappingJackson2XmlHttpMessageConverter 객체를 제공한다.

Spring (springboot아님) 에서는 아래와 같이 했었다.

@Configuration
public class MessageConverterConfig1 extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
        builder.indentOutput(true);
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
    }
}

그럼 Springboot 에서는 조금 더 쉽게 할수 있지 않을까 ? 맞다 바로 아래와 같이.

pom.xml dependency 추가 하면 자동으로 MappingJackson2XmlHttpMessageConverter 를 사용할수 있게 된다.

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

xml 전환하려는 객체 생성

@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "User")
public class User {

    @JacksonXmlProperty(localName = "name")
    private String name;
    @JacksonXmlProperty(localName = "age")
    private Integer age;

}

@Data、@NoArgsConstructor、@AllArgsConstructor Lombok 전용이다.@JacksonXmlRootElement、@JacksonXmlProperty 만 참고하면 된다.

xml 작성

<User>
    <name>aaaa</name>
    <age>10</age>
</User>

xml요청을 받는 controller 를 만든다.

@Controller
public class UserController {

    @PostMapping(value = "/user", 
        consumes = MediaType.APPLICATION_XML_VALUE, 
        produces = MediaType.APPLICATION_XML_VALUE)
    @ResponseBody
    public User create(@RequestBody User user) {
        user.setName("didispace.com : " + user.getName());
        user.setAge(user.getAge() + 100);
        return user;
    }

}

POSTMAN 으로 xml 요청을 해보자.

Last updated