我正在从中生成大量Java文件http://www.ncpdp.org的XSD文件(仅对成员可用)。生成它们之后,我希望在Spring控制器中使用它们,但在将响应转换为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();
}
}
我试图创建一个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?
我可以通过创建绑定来解决这个问题。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绑定的一个很好的资源。
myType也被定义为complexType。然后得到生成的类MyResponse.java和Reference.java。我可以通过以下方式分配“引用”的值: 而且奏效了。 现在我只是删除了maxOccurs=“unbounded”,它不再起作用了。响应不再是List类型,而是JaxBelement类型。我试着用: 谁能告诉我,当它不是一个列表时,什么是正确的做法?
生成器返回值 PHP7支持通过Generator::getReturn获取生成器方法return的返回值。 PHP5中我们约定使用Generator最后一次yield值作为返回值。 <?php final class AsyncTask { public function begin() { return $this->next(); } //
问题内容: 我正在使用JAXB在Maven中使用JAXB插件从XSD生成bean。一切正常,希望代码包含每个字段的isSetXXXXXX()方法。 例如 对于字段 firstName ,它将产生以下代码: 这是isSetFirstName()方法引起的问题,我不希望JAXB生成这些问题。 有没有办法阻止这种行为? 谢谢。 更新 解决此问题:问题出在xjb文件中,generateIsSetMetho
如何使用JAXB生成以下结构?在我的例子中,我有一个动态属性列表,它可能有3种类型:整数、字符串或列表。但是,列表属性具有嵌套元素。我怎样才能做到这一点?
嗨,所有Stackoverflow大师, 我正在开发一个应用程序,该应用程序使用来自某个rest webservice的JSON。 此链接上的示例JSONhttp://pastebin.com/embed_js.php?i=VYESA9MG(这是由于JSON有点长) 我创建了一个POJO类来满足这个JSON模型,如下所示: 这个模型在我们的代码中使用GSON模块调用。目前我已经抓到JSON,据了解
我有一个Java后端,提供openapi.json规范。它的目的是可以通过openapi生成器创建一个API客户端。这就是我所做的。客户端表现得很好,每个类都是完美的,它们都有它们应该拥有的属性,等等。一个例子是这个类: 如你所见,这门课看起来很好。 然后我有一个包含以下功能的服务: 那么,在执行这个类时,我期望得到什么呢?当它返回一个项目列表时,我还希望得到一个项目列表。但我得到的却是Linke