我有一些有效的代码,但我正在寻找一种更好的方法。我有一个RESTful Web API,我想支持JSON,XML和TEXT媒体类型。使用带有JAXB注释的“bean”类,JSON和XML很容易。我只是 text / plain 工作,但我希望Jersey更聪明一些,并且能够使用{{1}将我的bean列表List<Machine>
转换为字符串}。
这是Resource类。 JSON和XML媒体类型使用JAXB带注释的bean类。 text plain使用自定义字符串格式(基本上是命令的stdout表示)。
toString
有没有更好的方法来使用Jersey自动转换为字符串,所以我只需要在这里实现一个方法?(可以处理所有3种媒体类型)
我看到我可以实现MessageBodyWriter,但这似乎更麻烦。
如果重要,我使用嵌入式Jetty和Jersey选项。
谢谢!
答案 0 :(得分:4)
为了执行以下操作,您需要执行MessageBodyReader
/ Writer
:
@GET @Path("details/")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN })
public List<Machine> details() {
return manager.details();
}
编写的代码不是很多,如果你能够编写足够的通用代码,你就可以从中获得一些重用。
答案 1 :(得分:1)
由于某种原因,文档没有提到我需要使用MessageBodyWriter
注释@Provider
类。我做到了......
@Provider
@Produces(MediaType.TEXT_PLAIN)
public class PlainTextWriter implements MessageBodyWriter<Machine> {
...现在我在启动时看到此消息。*(好)
INFO: Provider classes found:
class com.blah.resources.PlainTextWriter
我仍然得到例外,
SEVERE: A message body writer for Java class java.util.ArrayList,
and Java type java.util.List<com.blah.beans.Machine>,
and MIME media type text/plain was not found
INFO: No provider classes found.
第二部分是我没有实现正确的类型。我有一个List
豆子。我认为泽西岛足够聪明,可以理解如何序列化列表,但我想它可以用不同的方式做到这一点。这是我的第二个改变:(注意添加List
)
@Provider
@Produces(MediaType.TEXT_PLAIN)
public class PlainTextWriter implements MessageBodyWriter<List<Machine>>
现在正在运作。它非常酷,因为现在我有一个普通的普通/文本实现。我只需要为每个Bean实现我的接口的toPlainText
方法。没有汗!
INFO: Scanning for root resource and provider classes in the packages:
com.my.project.resources
...
INFO: No provider classes found.
所以我将MessageBodyWriter重构为该包,它再次有效!