Java 如何使用@products注释?

Java 如何使用@products注释?,java,rest,jakarta-ee,annotations,jersey,Java,Rest,Jakarta Ee,Annotations,Jersey,我想在我正在编写的程序中使用@products({Mediatype.Application\uxml,Mediatype.Application\ujson})。我只想在一个方法上使用它,但我不知道它何时返回JSON对象,何时返回XML页面。下面是我正在编写的代码,在这两种情况下,它都会返回一个XML提要。如果它不符合if-else标准,我希望它返回一个JSON对象 @Path("/{search}") @GET @Produces({MediaType.APPLICATION_JSON, M

我想在我正在编写的程序中使用@products({Mediatype.Application\uxml,Mediatype.Application\ujson})。我只想在一个方法上使用它,但我不知道它何时返回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" );
}
@Path(“/{search}”)
@得到
@产生({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
公共字符串getCountryData(@PathParam(“搜索”)字符串搜索、@QueryParam(“ccode”)字符串ccode、@QueryParam(“scode”)字符串scode){
if(ccode.equals(“XML”)){
return“Tove JaniReminder本周末别忘了我!”;
}   
返回EndecaConn.ConnectDB(“搜索”,搜索,“模式匹配部分”);
}

必须将实体设置为域实体的响应对象返回。xml/json的序列化是自动完成的

见:

yYou可以返回如下实体:

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

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

媒体类型将是请求的一部分,不应将其作为查询参数。下面是一些示例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;
}

当客户端HTTP
Accept
头用于XML(
text/XML
)时,它将返回XML。如果是
application/json
,它将返回json。我不知道客户端将使用什么..我无法更改客户端的accept标头…因为我不是客户端..除了创建两个依赖于客户端的新方法之外,没有其他方法可以执行此操作..如果要编写xml或json,使用
@products
没有多大意义你自己.这都是关于内容的谈判。Google这个术语是为了更好地了解机制betterreturn EndecaConn.ConnectDB(“搜索”,Search,“mode matchallpartial”)为我对JSON进行序列化。我使用了一个将Java对象转换为JSON对象的对象映射器。所以我的班恩德卡康负责这件事。我想这就是你的意思。你可以做任何一件事。返回响应对象还允许您在实体中设置特定的头、URI和响应代码。