gpt4 book ai didi

spring - 从 Spring Boot Controller 返回 JAXB 生成的元素

转载 作者:行者123 更新时间:2023-12-02 18:16:34 32 4
gpt4 key购买 nike

我正在从 http://www.ncpdp.org 生成大量 Java 文件的 XSD 文件(仅成员(member)可用)。生成它们后,我想在 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));
}

这是我的 Controller :

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 来覆盖 Spring Boot 的 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?

最佳答案

我能够通过在与我的架构相同的目录中创建一个 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 绑定(bind)的良好资源。

关于spring - 从 Spring Boot Controller 返回 JAXB 生成的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070566/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com