[SPRING] Spring 부트 컨트롤러에서 JAXB 생성 요소 반환
SPRINGSpring 부트 컨트롤러에서 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.필자는 스키마와 동일한 디렉토리에 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 바인딩을 커스터마이징하는 방법에 대한 훌륭한 리소스라는 것을 알게되었습니다.
from https://stackoverflow.com/questions/26070566/returning-jaxb-generated-elements-from-spring-boot-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 프레임 워크 3.0에서 Hibernate와 Jdbc 사용하기 (0) | 2019.03.23 |
---|---|
[SPRING] Spring 3 MVC - 고급 데이터 바인딩 - 간단한 객체 목록으로 폼 요청 (0) | 2019.03.23 |
[SPRING] 봄에 임베디드 부두에서 스프링 보안 설정하기 (0) | 2019.03.23 |
[SPRING] Java SockJS Spring 클라이언트 및 메시지 크기 (0) | 2019.03.23 |
[SPRING] Spring MBeanExporter - MBean에 이름 지정하기 (0) | 2019.03.23 |