11

2つの質問があります:

1. 1つのクラスを作成し、それをJAXBアノテーション(XMLサポート用)で注釈を付けて、で宣言することはできますか?web.xml

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

JSON(Jacksonライブラリ)サポート用ですか?または、JSONとXMLの2つのクラスを別々に作成する必要がありますか?

または、RESTサービスがJSONとXMLの両方を返すようにするためのより洗練された方法が存在する可能性がありますか?

2.どのタイプ(JSONまたはXML)を返すかをプログラムで選択するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

9

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


1つのクラスを作成し、それをJAXBアノテーション(XMLサポート用)で注釈を付け、JSON(Jacksonライブラリ)サポート用にweb.xmlで宣言できますか?

いつでもApplicationクラスを使用して、JSONバインディングにMessageBodyReader/を指定できます。MessageBodyWriterジャクソンはそのjarファイルに実装を提供していると思います。Application以下は、JSONプロバイダーとしてMOXyを指定するクラスの例です。

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

または、JSONとXMLの2つのクラスを別々に作成する必要がありますか?

EclipseLink JAXB(MOXy)は、ネイティブXMLバインディングを提供し、JSONとXMLの両方に同じオブジェクトモデルを使用できるように設計されています。MOXyJsonProvider次のクラスを使用して、JAX-RSアプリケーションに統合できます。


返すタイプ(JSONまたはXML)をプログラムで選択するにはどうすればよいですか?

サーバ側

@Producesアノテーションを使用して、サービスがXMLメッセージとJSONメッセージの両方を提供するように指定できます。

@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("{id}")
public Customer read(@PathParam("id") long id) {
    return entityManager.find(Customer.class, id);
}

詳細については

クライアント側

MediaTypeを使用して、メッセージのタイプを示すことができます。以下は、JerseyクライアントAPIを使用した例です。URLが同じで、要求されたメディアタイプだけが異なることに注意してください。

Client client = Client.create();
WebResource resource = client.resource("http://localhost:8080/CustomerService/rest/customers");

// Get XML response as a Customer
Customer customer = resource.path("1")
    .accept(MediaType.APPLICATION_XML)
        .get(Customer.class);
System.out.println(customer.getLastName() + ", "+ customer.getFirstName());

// Get JSON response as a Customer
Customer customer = resource.path("1")
    .accept(MediaType.APPLICATION_JSON)
        .get(Customer.class);
System.out.println(customer.getLastName() + ", "+ customer.getFirstName());

詳細については

于 2012-07-08T11:16:10.203 に答える
7

クライアントがURLの一部を使用して応答タイプを構成する場合は、サーブレットフィルターを使用できます。

表現(メディアタイプ)のオーバーライドを実装する簡単な方法は、URLクエリパラメーターを使用できます。

/ resources / todo?format = json

サーブレットフィルタはURLクエリパラメータを解析し、format = jsonが存在する場合は、acceptヘッダー「application/json」を置き換えるか追加します。

于 2012-07-08T11:09:22.210 に答える
4

個別のクラスは必要ありません。必要なのは個別のメソッドです。

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Todo getXML() {
    Todo todo = new Todo();
    todo.setSummary("This is my first todo");
    todo.setDescription("This is my first todo");
    return todo;
}

次に、クライアント側で、サービスを要求するときに、必要な形式を指定します。

// Get XML
System.out.println(service.path("rest").path("todo").accept(MediaType.TEXT_XML).get(String.class));
// Get XML for application
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_XML).get(String.class));
// Get JSON for application
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_JSON).get(String.class));
于 2012-07-08T09:58:41.760 に答える