创建text / plain Jersey响应

时间:2014-03-24 13:40:58

标签: java web-services rest jaxb jersey

我有一些有效的代码,但我正在寻找一种更好的方法。我有一个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选项。

谢谢!

2 个答案:

答案 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)

1。 @provider

由于某种原因,文档没有提到我需要使用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
  • 如果没有@Provider,您会在启动时收到此消息:INFO: No provider classes found.

2。使用正确的类型

第二部分是我没有实现正确的类型。我有一个List豆子。我认为泽西岛足够聪明,可以理解如何序列化列表,但我想它可以用不同的方式做到这一点。这是我的第二个改变:(注意添加List

@Provider
@Produces(MediaType.TEXT_PLAIN)
public class PlainTextWriter implements MessageBodyWriter<List<Machine>>

现在正在运作。它非常酷,因为现在我有一个普通的普通/文本实现。我只需要为每个Bean实现我的接口的toPlainText方法。没有汗!

3。使用正确的包。

它又破了。看着日志,我看到了:

INFO: Scanning for root resource and provider classes in the packages:
  com.my.project.resources
...
INFO: No provider classes found.

所以我将MessageBodyWriter重构为该包,它再次有效!