我有一个使用Spring(v4.0.5)的http服务。它的http端点是使用Spring Web MVC配置的。响应是从模式生成的带有JAXB2注释的类。由于JAXBElement生成的JAXB类@XmlRootElement不带有注释(因此不能修改架构来对此进行注释),因此响应被打包。我不得不为使XML编组工作而斗争。无论如何,它都在工作。
JAXBElement
@XmlRootElement
现在,我正在设置JSON编组。我正在遇到的是获取具有JAXBElement“信封” 特征的JSON文档。
{ "declaredType": "io.github.gv0tch0.sotaro.SayWhat", "globalScope": true, "name": "{urn:io:github:gv0tch0:sotaro}say", "nil": false, "scope": "javax.xml.bind.JAXBElement$GlobalScope", "typeSubstituted": false, "value": { "what": "what", "when": "2014-06-09T15:56:46Z" } }
我想整理的只是value-object:
value
{ "what": "what", "when": "2014-06-09T15:56:46Z" }
这是我的JSON编组配置(Spring上下文配置的一部分):
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="jacksonMapper" /> <property name="supportedMediaTypes" value="application/json" /> </bean> <bean id="jacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd'T'HH:mm:ss'Z'" /> <property name="timeZone"> <bean class="java.util.TimeZone" factory-method="getTimeZone"> <constructor-arg type="java.lang.String" value="UTC" /> </bean> </property> </bean> </property> </bean>
我希望可以通过配置来完成此操作ObjectMapper。我想也可以推出自己的序列化程序。有什么想法吗?有什么建议吗?
ObjectMapper
您可以为JAXBElement类注册一个mixin批注,该批注会将@JsonValue批注放在JAXBElement.getValue()方法上,使其返回值成为JSON表示形式。这是一个例子:
提供给的示例.xsd chema文件xjc。
xjc
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="item" type="Thing"/> <xs:complexType name="Thing"> <xs:sequence> <xs:element name="number" type="xs:long"/> <xs:element name="string" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema>
Java主类:
public class JacksonJAXBElement { // a mixin annotation that overrides the handling for the JAXBElement public static interface JAXBElementMixin { @JsonValue Object getValue(); } public static void main(String[] args) throws JAXBException, JsonProcessingException { ObjectFactory factory = new ObjectFactory(); Thing thing = factory.createThing(); thing.setString("value"); thing.setNumber(123); JAXBElement<Thing> orderJAXBElement = factory.createItem(thing); System.out.println("XML:"); JAXBContext jc = JAXBContext.newInstance(Thing.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(orderJAXBElement, System.out); System.out.println("JSON:"); ObjectMapper mapper = new ObjectMapper(); mapper.addMixInAnnotations(JAXBElement.class, JAXBElementMixin.class); System.out.println(mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(orderJAXBElement)); } }
输出:
XML: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <item> <number>123</number> <string>value</string> </item> JSON: { "number" : 123, "string" : "value" }