3

Jersey 2.0に移行しようとしています。これは私にジャクソンの苦痛を与えており、ドキュメントはMoxyの使用を推奨しています。

すべてがうまく一致するgetおよびpost呼び出しでMoxyを動作させましたが、未知の要素の可能性に対処する必要があります。

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

これは jersey 2.0 に変更する前はうまく機能し、そのままにしておくと問題は発生しませんが、呼び出されることはありません。

これをJersey 2.0に実装するにはどうすればよいですか? モクシーでもジャクソンでも大丈夫です。

私の依存関係

'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',

これは私のweb.xmlには影響しません

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>
4

3 に答える 3

8

MOXy の代わりにモジュールを使用jersey-media-json-jacksonして、注釈を利用できます (MOXy が同様の機能をサポートしているかどうかはわかりません)。いくつかのメモ:

  • com.sun.jersey.api.json.POJOMappingFeatureから init パラメータを削除します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)marshalling を処理する必要があり、それを認識する必要があり@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);
于 2013-08-06T08:03:39.637 に答える
5

: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

MOXy には、Jackson の@JsonAnySetter. このタイプの動作を追加するために、次の拡張リクエストを入力しました。

以下は、ユースケースに適用できる 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);
    }

}

住所

package forum18068176;

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

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

}

マッピング ドキュメント (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>

デモ

以下は、すべてがどのように機能するかを確認するために実行できるスタンドアロンのデモ コードです。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);
    }

}

input.json/出力

{
   "firstName" : "Jane",
   "lastName" : "Doe",
   "billingAddress" : {
      "street" : "1 A Street"
   },
   "shippingAddress" : {
      "street" : "2 B Road"
   }
}

MOXy の @XmlVariableNode 拡張XmlAdapter

不明な項目がすべて同じタイプである場合、MOXy の組み合わせを使用して@XmlVariableNode( http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-json-schema.htmlを参照) XmlAdapter、望ましい結果:

于 2013-08-06T14:29:39.607 に答える
2

Jersey 2.0 は、 https://github.com/FasterXML/jackson-jaxrs-providersの変更されていない Jackson 2.x JAX-RS プロバイダーで正常に動作するはずです。プロバイダーはサービス プロバイダー インターフェイスを使用するため、web.xml を介して何も構成する必要はありません。唯一の潜在的な問題は、同じメディア タイプに対して複数のプロバイダーを使用することです。

Jackson 依存関係の 2.x (2.2.2 など) バージョンを必ず使用してください。Jackson 1.x と 2.x のバージョンは共存できますが、モジュール間の依存関係は一致する必要があります (つまり、2.2 JAX-RS プロバイダーは 2.2 jackson-core および jackson-databind jar に依存します)。

于 2013-08-05T22:25:29.847 に答える