Java 运动衫如何根据url参数生成json和xml输出

Java 运动衫如何根据url参数生成json和xml输出,java,xml,json,jaxb,jersey,Java,Xml,Json,Jaxb,Jersey,这是一项运动衫服务: @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Response service(@QueryParam("format") String format) { if (format.equals("json")) {...} return response; } 我想根据url参数格式生成XML或JSON响应 我的响应实例由jaxb2 我知道如果

这是一项
运动衫
服务:

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {

  if (format.equals("json")) {...}

  return response;

}
我想根据url参数格式生成
XML
JSON
响应

我的响应实例由
jaxb2

我知道如果在Java客户端/功能测试中使用以下代码,我可能会得到
xml
json
响应:

String content = service.path("").queryParam("myparam", "myvalue").accept(MediaType.APPLICATION_XML).get(String.class);


但我需要根据url参数来执行此操作。

好的。既然我们在这里谈论的是模式之外的事情,那么让我试试:

在服务上使用过滤器(查找com.sun.jersey.spi.container.ResourceFilterFactory)并根据查询参数更改(或添加或覆盖)accept标头如何


我承认这不是最诚实的方法,但我认为您应该尝试一下

您可以通过(假设您想返回
HTTP200
status)方法直接设置响应实体的媒体类型

或者通过使用方法


这不是做你想做的事的正确方法。您不应该使用查询参数来确定输出格式。您已经声明资源方法同时生成XML和JSON,标准的兼容方式是让客户端发送一个适当的HTTP“Accept”头,该头声明了它们能够使用的媒体类型。如果他们发送“Accept:application/json”,您的JAX-RS实现应该选择将方法的响应格式化为json,如果客户机发送“Accept:application/xml”,它应该自动将您的响应格式化为xml。如果客户机表示可以接受其中任何一个,那么您的JAX-RS实现可以自由选择其中一个,您不必在意。如果客户机表示它们也不能接受,那么您的JAX-RS应该发回一个适当的HTTP错误代码,表明它们没有办法发回正确的响应。

这里是完整的示例,上面的答案是正确的。我也使用上述方法,但在处理列表时遇到了问题。我将实体设置为:

public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> entity= courseService.getAllCourses();
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}
在阅读了jersey文档之后,我找到了我们需要在课程列表中使用GenericEntity的解决方案。这里是一个例子

@GET
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> list = courseService.getAllCourses();
    GenericEntity<List<Course>> entity = new GenericEntity<List<Course>>(list) {};
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}
@GET
@产生({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
公共响应getCoursesJSONOrXML(@QueryParam(“type”)字符串类型){
//这是我们的名单
List=courseService.getAllCourses();
GenericeEntity实体=新的GenericeEntity(列表){};
响应=响应
.ok(实体“xml”.equals(类型)?MediaType.APPLICATION\u xml:MediaType.APPLICATION\u JSON)
.build();
返回响应;
}

如果您可以发送适当的
ContentType
参数
application/json
而不是
json
,那么您可以使用
MediaType.valueOf(format)
来获取
MediaType
实例并将其与accept方法一起使用。您是否不知道如何设置响应的内容类型,或者…?我可能会错过smth/但“这不是正确的方式”并不完全正确。例如,如果他想创建一个OData服务呢?甚至在标准中,它必须有一个查询参数$format来选择输出格式。在看到您的响应之前,我对OData一无所知,从未使用过它。我的回答基于我当时对REST原则的了解。我相信你的话,OData可以做到这一点,但似乎仍然不对,因为REST应该基于利用HTTP标准,而从查询参数确定输出格式并不是我所知道的任何类型的HTTP标准。我同意,在可能的情况下,REST应该始终遵守这些标准。有趣的是,任何服务都需要数据类型作为查询参数——似乎作者对REST不太熟悉,或者它不是REST,就像REST一样。
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {
    return Response
            // Set the status and Put your entity here.
            .ok(entity)
            // Add the Content-Type header to tell Jersey which format it should marshall the entity into.
            .header(HttpHeaders.CONTENT_TYPE, "json".equals(format) ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML)
            .build();
}
public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> entity= courseService.getAllCourses();
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}
MessageBodyWriter not found for media type=application/json, type=class java.util.Arrays$ArrayList, genericType=class java.util.Arrays$ArrayList
@GET
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Response getCoursesJSONOrXML(@QueryParam("type") String type){
    //Here we get list
    List<Course> list = courseService.getAllCourses();
    GenericEntity<List<Course>> entity = new GenericEntity<List<Course>>(list) {};
    Response response = Response
            .ok(entity, "xml".equals(type) ? MediaType.APPLICATION_XML : MediaType.APPLICATION_JSON)
            .build();
    return response;
}