注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
我可以创建一个类,使用 JAXB 注释(用于 XML 支持)对其进行注释并在 web.xml 中声明以支持 JSON(杰克逊库)吗?
您始终可以使用Application
类来为 JSON 绑定指定MessageBodyReader
/ MessageBodyWriter
。我相信杰克逊在其 jar 中提供了一个实现。下面是一个将Application
MOXy 指定为 JSON 提供程序的类的示例:
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 分别创建两个类?
EclipseLink JAXB (MOXy) 提供原生 XML 绑定,旨在使您能够对 JSON 和 XML 使用相同的对象模型。您可以使用以下类将其集成到您的 JAX-RS 应用程序中MOXyJsonProvider
:
如何以编程方式选择要返回的类型(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());
了解更多信息