什么是moxy相当于Jackson的JsonAnySetter?

Div*_*ver 3 jackson moxy jersey-2.0

我正试图转移到泽西岛2.0.这给了我杰克逊的痛苦,而且文档推荐使用Moxy.

我让Moxy为get和post调用工作,其中一切都匹配得很好但是我需要处理可能的未知元素.

// Handle unknown deserialization parameters
@JsonAnySetter
protected void handleUnknown(String key, Object value) {
    if (unknownParameters == null) {
        unknownParameters = new HashMap<>();
    }
    unknownParameters.put(key, value);
}
Run Code Online (Sandbox Code Playgroud)

这在换到球衣2.0之前运作良好,即使它在我离开它时不会引起任何问题也永远不会被调用.

我如何在Jersey 2.0中实现这一点?我对Moxy或Jackson很好.

我的依赖

'org.codehaus.jackson:jackson-mapper-asl:1.9.2',
'org.eclipse.persistence:org.eclipse.persistence.moxy:2.5.0',
'org.glassfish.jersey.media:jersey-media-moxy:2.0',
Run Code Online (Sandbox Code Playgroud)

这在我的web.xml中没有任何影响

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

Mic*_*dos 8

您可以使用jersey-media-json-jackson模块而不是MOXy来利用注释(我不确定MOXy是否支持类似功能).只有几点说明:

  • 删除你的com.sun.jersey.api.json.POJOMappingFeatureinit参数web.xml- Jersey 2.x无法识别此属性(具体是Jersey 1.x)
  • 删除org.glassfish.jersey.media:jersey-media-moxy:2.0依赖
  • 添加org.glassfish.jersey.media:jersey-media-json-jackson:2.0依赖项并在您的应用程序中注册JacksonFeature(见下文)

在这些步骤之后,Jackson应该处理Object < - > JSON(un)编组,它应该识别@JsonAnySetter.

JacksonFeature在您的应用程序中注册,请参阅用户指南中的专用部分(8.1.4 Jackson):

// Create JAX-RS application.
final Application application = new ResourceConfig()
        .packages("org.glassfish.jersey.examples.jackson")
        .register(MyObjectMapperProvider.class)  // No need to register this provider if no special configuration is required.
        .register(JacksonFeature.class);
Run Code Online (Sandbox Code Playgroud)


bdo*_*han 5

注意:我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB(JSR-222)专家组的成员。

MOXy没有与Jackson的直接等效@JsonAnySetter。我已输入以下增强请求以添加此类行为:

以下是一些适用于您的用例的有关MOXy扩展的信息。


MOXy的 @XmlVirtualAccessMethods

如果JSON属性不是真正未知的,那么它们就不会作为域模型中的属性存在,那么您可以使用MOXy的@XmlVirtualAccessMethods扩展名(请参阅:http : //blog.bdoughan.com/2011/06/extensible-models-with -eclipselink-jaxb.html)。

Java模型

顾客

@XmlVirtualAccess方法的注释用于指定的Customer类是可扩展的。

import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods;

@XmlVirtualAccessMethods(setMethod = "put")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    private String firstName;
    private Address billingAddress;

    @XmlTransient
    private Map<String, Object> extensions = new HashMap<String, Object>();

    public <T> T get(String property) {
        return (T) extensions.get(property);
    }

    public void put(String property, Object value) {
        extensions.put(property, value);
    }

}
Run Code Online (Sandbox Code Playgroud)

地址

package forum18068176;

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}
Run Code Online (Sandbox Code Playgroud)

映射文件(oxm.xml)

扩展属性的定义在MOXy的映射文档中定义(请参阅:http ://blog.bdoughan.com/2011/04/moxys-xml-metadata-in-jax-rs-service.html )。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum18068176">
    <java-types>
        <java-type name="Customer">
            <xml-type prop-order="firstName lastName billingAddress shippingAddress"/>
            <java-attributes>
                <xml-element
                    java-attribute="lastName"
                    type="java.lang.String"/>
                <xml-element
                    java-attribute="shippingAddress"
                    type="forum18068176.Address"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>
Run Code Online (Sandbox Code Playgroud)

演示版

下面是一些独立的演示代码,您可以运行它们以查看一切工作方式。您需要将MOXy指定为JAXB提供程序(请参阅:http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html )。

package forum18068176;

import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum18068176/oxm.xml");
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, properties);

        // Unmarshal JSON
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource json = new StreamSource("src/forum18068176/input.json");
        Customer customer = unmarshaller.unmarshal(json, Customer.class).getValue();

        // Access Extension Properties
        String lastName = customer.<String>get("lastName");
        Address shippingAddress = customer.<Address>get("shippingAddress");

        // Marshal Objects
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

input.json /输出

{
   "firstName" : "Jane",
   "lastName" : "Doe",
   "billingAddress" : {
      "street" : "1 A Street"
   },
   "shippingAddress" : {
      "street" : "2 B Road"
   }
}
Run Code Online (Sandbox Code Playgroud)

MOXy的@XmlVariableNode扩展名带有 XmlAdapter

如果所有未知项目都属于同一类型,则可以使用MOXy的组合@XmlVariableNode(请参阅:http : //blog.bdoughan.com/2013/06/moxys-xmlvariablenode-json-schema.html )并XmlAdapter获取预期结果: