注: 私は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());
詳細については