【问题标题】:How to use @produces annotation?如何使用@produces注解?
【发布时间】:2013-07-24 18:36:05
【问题描述】:

我想在我正在编写的程序中使用@Produces({Mediatype.Application_XML, Mediatype.Application_JSON})。我只想在一种方法上使用它,但我很困惑它什么时候返回一个 JSON 对象,什么时候返回一个 XML 页面。这是我正在编写的代码,在这两种情况下它都会返回一个 XML 提要。如果它不符合 if-else 标准,我希望它返回一个 JSON 对象。

@Path("/{search}")
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
public String getCountryData(@PathParam("search") String search,    @QueryParam("ccode") String ccode , @QueryParam("scode") String scode) {

    if(ccode.equals("XML")){
        return "<note> <to>Tove</to> <from>Jani</from><heading>Reminder</heading> <body>Don't forget me this weekend!</body></note>";   
    }   

    return EndecaConn.ConnectDB("Search", search,"mode matchallpartial" );
}

【问题讨论】:

  • 当客户端 HTTP Accept 标头用于 XML (text/xml) 时,它将返回 XML。如果是application/json,则返回json。
  • 我不知道客户端要使用什么..我无法更改客户端的接受标头...因为我不是客户端..有没有其他方法可以做到这一点。 .除了创建两个新方法
  • 这取决于您的客户。
  • 如果您要自己编写 xml 或 json,使用 @Produces 没有多大意义。
  • 一切都是关于内容协商的。谷歌这个词以更好地了解机制

标签: java rest jakarta-ee annotations jersey


【解决方案1】:

媒体类型将是请求的一部分,您不应将其作为查询参数包含在内。下面是一些示例 Java 代码,它将以 application/xml 形式请求数据。

String uri =
    "http://localhost:8080/CustomerService/rest/customers/1";
URL url = new URL(uri);
HttpURLConnection connection =
    (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");

JAXBContext jc = JAXBContext.newInstance(Customer.class);
InputStream xml = connection.getInputStream();
Customer customer =
    (Customer) jc.createUnmarshaller().unmarshal(xml);

connection.disconnect();

在您的示例中,您可以有不同的方法对应于不同媒体类型的相同路径。

@Path("/{search}")
@GET
@Produces(MediaType.APPLICATION_JSON) 
public String getCountryDataJSON(@PathParam("search") String search, @QueryParam("scode") String scode) {
    return JSON;
}

@Path("/{search}")
@GET
@Produces(MediaType.APPLICATION_XML) 
public String getCountryDataXML(@PathParam("search") String search, @QueryParam("scode") String scode) {
    return XML;
}

【讨论】:

    【解决方案2】:

    您必须返回一个 Response 对象,并将实体设置为您的域实体。 xml/json的序列化是自动完成的。

    见:https://jsr311.java.net/nonav/releases/1.1/javax/ws/rs/core/Response.html

    y你可以像这样返回一个实体:

    Foo myReturn = new Foo(blah,blah,blah)
    return Response.ok(myReturn).build()
    

    如果您需要细粒度的序列化,您可以在您的域类上使用注释。

    【讨论】:

    • return EndecaConn.ConnectDB("Search", search,"mode matchallpartial" ) 为我序列化为 JSON。我使用了一个将 Java 对象转换为 JSON 对象的对象映射器。所以我的班级 EndecaConn 会处理这个问题。我想这就是你的意思。
    • 你也可以。返回 Response 对象还允许您设置特定的标头、URI 和响应代码以及您的实体。
    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 2023-03-24
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2020-03-21
    • 2020-12-13
    相关资源
    最近更新 更多