休息.新泽西州.如何以编程方式选择要返回的类型:JSON还是XML?

MyT*_*tle 11 java xml rest json jersey

我有两个问题:

1.我可以创建一个类,使用JAXB注释(对于XML支持)进行注释并声明web.xml

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

对于JSON(杰克逊图书馆)的支持?或者我需要为JSON和XML单独创建两个类?

或者可能存在一些更优雅的方式使REST服务返回JSON和XML?

2.我如何以编程方式选择要返回的类型(JSON或XML)?

谢谢.

bdo*_*han 9

注意: 我是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;
    }

}
Run Code Online (Sandbox Code Playgroud)

或者我需要为JSON和XML单独创建两个类?

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);
}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息

客户端

您可以使用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());
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息


mjn*_*mjn 7

如果您的客户端想要使用URL的一部分来配置响应类型,则可以使用Servlet过滤器.

实现覆盖表示(媒体类型)的简单方法可以使用URL查询参数:

/资源/待办事项?格式= JSON

Servlet过滤器解析URL查询参数,如果存在format = json,则替换或添加accept标头"application/json".

  • 响应可以指定内容类型:return Response.ok.(...).type("application/json").build(); (4认同)
  • 如果你对像我这样的URL很挑剔,你可以使用文件扩展名:`/ resources/todo.json`或`/ resources/todo.xml` (3认同)