복붙노트

[SPRING] Spring 부트 컨트롤러에서 JAXB 생성 요소 반환

SPRING

Spring 부트 컨트롤러에서 JAXB 생성 요소 반환

저는 http : //www.ncpdp.org의 XSD 파일 (회원들에게만 제공됨)에서 많은 자바 파일을 생성하고 있습니다. 그들을 생성 한 후 Spring Controller에서 사용하고 싶지만 응답을 XML로 변환하는 데 문제가 있습니다.

JAXBElement 뿐만 아니라 요소 자체를 반환하려고 시도했지만 둘 다 작동하지 않는 것 같습니다. 아래 테스트가 실패합니다.

java.lang.AssertionError: Status 
Expected :200
Actual   :406

@Test
public void testHelloWorld() throws Exception {
    mockMvc.perform(get("/api/message")
            .accept(MediaType.APPLICATION_XML)
            .contentType(MediaType.APPLICATION_XML))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_XML));
}

내 컨트롤러는 다음과 같습니다.

import org.ncpdp.schema.transport.MessageType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @RequestMapping(value = "/api/message", method = RequestMethod.GET)
    public MessageType messageType() {
        return new MessageType();
    }
}

스프링 부트의 MVC 설정을 오버라이드 할 MvcConfig를 만들려고 시도했지만 작동하지 않는 것 같습니다.

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(marshallingHttpMessageConverter());
    }

    @Bean
    public MarshallingHttpMessageConverter marshallingHttpMessageConverter() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setPackagesToScan(new String[]{"com.ncpdb.schema.transport"});

        MarshallingHttpMessageConverter converter = new MarshallingHttpMessageConverter();
        converter.setMarshaller(jaxb2Marshaller);
        converter.setUnmarshaller(jaxb2Marshaller);
        converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_XML));

        return converter;
    }
}

생성 된 JAXB 객체를 XML로 마샬링하기 위해 Spring MVC를 얻으려면 어떻게해야합니까?

해결법

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

    1.필자는 스키마와 동일한 디렉토리에 bindings.xjb 파일을 작성하여이를 해결할 수있었습니다. 이것에 의해, JAXB는 클래스에 @XmlRootElement를 생성합니다.

    필자는 스키마와 동일한 디렉토리에 bindings.xjb 파일을 작성하여이를 해결할 수있었습니다. 이것에 의해, JAXB는 클래스에 @XmlRootElement를 생성합니다.

    <?xml version="1.0"?>
    <jxb:bindings version="1.0"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">
    
        <jxb:bindings schemaLocation="transport.xsd" node="/xsd:schema">
            <jxb:globalBindings>
                <xjc:simple/>
            </jxb:globalBindings>
        </jxb:bindings>
    </jxb:bindings>
    

    반환 된 XML에 네임 스페이스 접두사를 추가하려면 몇 가지 인수를 추가하기 위해 maven-jaxb2-plugin을 수정해야했습니다.

    <arg>-extension</arg>
    <arg>-Xnamespace-prefix</arg>
    

    그리고 의존성을 추가하십시오 :

    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-namespace-prefix</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>
    

    그런 다음 내 bindings.xjb를 수정하여 다음을 포함 시키십시오.

    <?xml version="1.0"?>
    <jxb:bindings version="1.0"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"
                  xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
                  http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd">
    
        <jxb:bindings schemaLocation="transport.xsd" node="/xsd:schema">
            <jxb:globalBindings>
                <xjc:simple/>
            </jxb:globalBindings>
    
            <jxb:schemaBindings>
                <jxb:package name="org.ncpdp.schema.transport"/>
            </jxb:schemaBindings>
            <jxb:bindings>
                <namespace:prefix name="transport"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    

    https://java.net/projects/jaxb2-commons/pages/Namespace-prefix에서이 작업을 수행하는 방법을 배웠습니다. 또한 http://blog.frankel.ch/customize-your-jaxb-bindings가 JAXB 바인딩을 커스터마이징하는 방법에 대한 훌륭한 리소스라는 것을 알게되었습니다.

  2. from https://stackoverflow.com/questions/26070566/returning-jaxb-generated-elements-from-spring-boot-controller by cc-by-sa and MIT license