当前位置: 首页 > 面试题库 >

如何在没有JAXBElement包装器的情况下以JSON封送JAXBElement包装的响应?

卢出野
2023-03-14
问题内容

我有一个使用Spring(v4.0.5)的http服务。它的http端点是使用Spring Web
MVC配置的。响应是从模式生成的带有JAXB2注释的类。由于JAXBElement生成的JAXB类@XmlRootElement不带有注释(因此不能修改架构来对此进行注释),因此响应被打包。我不得不为使XML编组工作而斗争。无论如何,它都在工作。

现在,我正在设置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:

{
  "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。我想也可以推出自己的序列化程序。有什么想法吗?有什么建议吗?


问题答案:

您可以为JAXBElement类注册一个mixin批注,该批注会将@JsonValue批注放在JAXBElement.getValue()方法上,使其返回值成为JSON表示形式。这是一个例子:

提供给的示例.xsd chema文件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"
}


 类似资料:
  • 我正在尝试安装一个没有依赖项的python模块。 我跑: 但是这个安装依赖项,任何想法怎么能做到这一点?

  • 我扩展了moxy代码以使用XML模式定义,而不是JAXB注释bean。xjc编译的XML模式生成与原始示例相同的XML和JSON编码。 我按照jersey的说明,使用ObjectFactory在CustomerResource中生成JAXBElement客户对象表示。JAVA我还按照描述修改了客户机。我还将Jersey 2.2下的JAXB与MOXy结合在一起,解决了PUT问题中描述的JSON处理问

  • 问题内容: 我正在使用/ /在Mac OS X上进行一些研究计算。为了提高性能,我们从大学租了一个400节点的集群(使用Linux),以便可以并行完成任务。问题是我们不允许在集群上安装任何额外的软件包(否或任何安装工具),它们仅提供原始python本身。 然后如何在群集上运行脚本?有没有办法集成模块(我认为numpy和scipy也具有一些已编译的二进制文件),以便可以在不安装软件包的情况下进行解释

  • 我有下面的JAXB注释类(用XJC生成) 当以下面的方式解组它时,一切都很好: 当按以下方式解组时,它将崩溃,出现异常 例外: 有人能解释这种奇怪的行为吗? 正在解组的XML文件粘贴在下面:

  • 问题内容: 我有一个使用JAXB创建的相当大的重复XML。将整个对象存储在内存中然后进行封送处理会占用太多内存。本质上,我的XML如下所示: 目前,我对这个问题的解决方案是将根标记“硬编码”到输出流,并逐个编组每个重复元素: JAXB以某种方式生成这样的XML 尽管这是一个有效的XML,但它看起来很难看,所以我想知道是否有任何方法告诉编组不要为item元素放置名称空间?还是有更好的方法使用JAXB

  • 问题内容: 我怎么能包括为没有MANIFEST.in文件? 我的setup.py看起来像这样: 版本: 我就是无法加入。 还是此博客文章仍然正确? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging- documentation-on– package_data-/ 不过,在过去的一个小时中,我了解到这