我从http://www.ncpdp.org的XSD文件(仅限成员可用)中生成大量Java文件。生成它们之后,我想在我的Spring控制器中使用它们,但我在将响应转换为XML时遇到问题。从Spring引导控制器返回JAXB生成的元素
我试过返回元素本身,以及JAXBElement < T>,但似乎都没有工作。下面的测试失败:
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();
}
}
我试图创建一个MvcConfig覆盖春天启动的MVC配置,但它似乎并不奏效。
@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;
}
}
我需要做什么才能让Spring MVC将我生成的JAXB对象编组为XML?
问题:生成的'MessageType'是否有一个'@ XmlRootElement'注释。它看起来像默认的XML转换器'Jaxb2RootElementHttpMessageConverter'需要这个注释来考虑一个'MessageType'的实例来支持编组 – 2014-09-27 02:55:39
@BijuKunjummen是正确的!查看https://github.com/spring-projects/spring-boot/issues/407 – geoand 2014-09-27 05:49:41
GET可以真正拥有application/xml的内容类型吗?也许这是不能转换的请求? – 2014-09-27 07:21:53