2013-07-24 80 views
2

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

@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"); 
} 
+0

当一个客户HTTP'Accept'头是XML('text/xml')时,它将返回XML。如果它是'application/json',它将返回json。 –

+0

我不知道客户端将使用什么..我不能改变客户端的接受头...因为我不是客户端..没有其他方式来做它..除了创建两个新的方法 –

+0

这取决于你的客户。 –

回答

0

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

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

yYou可以返回一个实体是这样的:

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

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

+0

返回EndecaConn.ConnectDB(“搜索”,搜索,“模式matchallpartial”)为我做序列化为JSON。我使用了一个将Java对象转换为JSON对象的对象映射器。所以我的班级EndecaConn负责照顾。我认为这就是你的意思。 –

+0

你也可以做。返回一个Response对象允许你同时设置特定的头文件,URI和响应代码。 –

1

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

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; 
}