6

JAX RS を使用して、通常の .xml を使用して REST Web サービスを作成してい@Path, @GET, @Produces({"application/json, "application/xml"})ます。

リクエストのタイプに応じて、JSON または XML として送信されるレスポンスとして POJO を返しています。別のエンティティとの多対多の関係を追加するまで、正常に機能していました。この関係は双方向です。

JBoss AS 7を使用しています。ジャクソンのものを追加@JsonManagedReferenceしまし@JsonBackReferenceたが、役に立ちませんでした。

これを乗り越える方法は?

私はこのように私のJAX RSを展開しました:-

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>    

Application クラスを拡張したり、JAXRS アクティベーター クラスを使用したりしませんでした。

この JBoss の RESTEasy は Jackson を JSON プロバイダーとして使用していますが、それでも@JsonManagedReferenceアノテーションを認識しないのはなぜですか?

依存関係を更新する必要がありますか? はいの場合、どうすればよいですか? また、リクエストが XML の場合の修正方法も、JAXB の循環参照で失敗します。

前もって感謝します!

4

1 に答える 1

5

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

MOXy@XmlInverseReferenceは、 XML バインディングと JSON バインディングの両方で双方向の関係をサポートするために使用できる拡張機能を提供します。


ジャバモデル

お客様

CustomerオブジェクトのコレクションがありPhoneNumberます。

package forum12312395;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Customer {

    private List<PhoneNumber> phoneNumbers;

    @XmlElement(name="phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

}

電話番号

PhoneNumberオブジェクトは、オブジェクトへのバック ポインターを保持しCustomerます。このプロパティには、注釈が付けられてい@XmlInverseReferenceます。

package forum12312395;

import javax.xml.bind.annotation.XmlValue;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

public class PhoneNumber {

    private String value;
    private Customer customer;

    @XmlValue
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @XmlInverseReference(mappedBy="phoneNumbers")
    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

}

jaxb.properties

MOXy を JAXB プロバイダーとして使用するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html ):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

入力

以下は、この例で非整列化するドキュメントです

入力.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <phone-number>555-WORK</phone-number>
    <phone-number>555-HOME</phone-number>
</customer>

入力.json

{
    "customer" : {
        "phone-number" : ["555-HOME", "555-WORK"]
    }
}

デモ

package forum12312395;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
import org.eclipse.persistence.oxm.MediaType;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        // JSON
        Unmarshaller jsonUnmarshaller = jc.createUnmarshaller();
        jsonUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        StreamSource json = new StreamSource("src/forum12312395/input.json");
        Customer customerFromJSON = (Customer) jsonUnmarshaller.unmarshal(json);
        for(PhoneNumber phoneNumber : customerFromJSON.getPhoneNumbers()) {
            System.out.println(phoneNumber.getCustomer());
        }

        // XML
        Unmarshaller xmlUnmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource("src/forum12312395/input.xml");
        Customer customerFromXML = (Customer) xmlUnmarshaller.unmarshal(xml);
        for(PhoneNumber phoneNumber : customerFromXML.getPhoneNumbers()) {
            System.out.println(phoneNumber.getCustomer());
        }
    }

}

出力

以下は、デモ コードを実行した結果の出力です。ご覧のとおり、customerプロパティはすべてのPhoneNumberオブジェクトに設定されています。

forum12312395.Customer@3ef38fd1
forum12312395.Customer@3ef38fd1
forum12312395.Customer@320eef20
forum12312395.Customer@320eef20

詳細については

于 2012-09-07T10:28:14.227 に答える