【问题标题】:Create a text/plain Jersey response创建文本/纯泽西响应
【发布时间】:2014-05-01 21:50:43
【问题描述】:

我有一些有效的代码,但我正在寻找一种更好的方法来做到这一点。我有一个 RESTful Web API,我想支持 JSON、XML 和 TEXT 媒体类型。 JSON 和 XML 很容易使用带有 JAXB 注释的“bean”类。我刚刚得到 text/plain 的工作,但我希望 Jersey 更聪明一点,并且能够将我的 bean 列表 List<Machine> 转换为使用 toString 的字符串。

这里是资源类。 JSON 和 XML 媒体类型使用 JAXB 注释 bean 类。纯文本使用自定义字符串格式(基本上是命令的标准输出表示)。

@Path("/machines")
public class MachineResource {
    private final MachineManager manager;

    @Inject
    public MachineResource(MachineManager manager) {
        this.manager = manager;
    }

    @GET @Path("details/")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public List<Machine> details() {
        return manager.details();
    }
    @GET @Path("details/")
    @Produces({ MediaType.TEXT_PLAIN })
    public String detailsText() {
        StringBuilder text = new StringBuilder();       
        for(Machine machine : manager.details()) {
            text.append(machine.toString());
        }
        return text.toString();
    }

有没有更好的方法可以让 Jersey 自动转换为字符串,所以我只需要在这里实现一个方法?(可以处理所有 3 种媒体类型)

我看到我可以实现MessageBodyWriter,但这似乎要麻烦得多。

编辑:

如果重要的话,我会使用嵌入式 Jetty 和 Jersey 选项。

谢谢!

【问题讨论】:

    标签: java web-services rest jaxb jersey


    【解决方案1】:

    1。 @提供者

    由于某种原因,文档没有提到我需要用@Provider 注释MessageBodyWriter 类。我已经做到了……

    @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 重构到那个包中,它又可以工作了!

    【讨论】:

      【解决方案2】:

      实现MessageBodyReader/Writer 将是您需要执行的操作才能执行以下操作:

      @GET @Path("details/")
      @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN })
      public List<Machine> details() {
          return manager.details();
      }
      

      编写的代码并不多,如果您能够编写足够通用的代码,您将能够从中获得一些重用。

      【讨论】:

      • @Jess - 这是一个例子MessageBodyReader/Writer: blog.bdoughan.com/2012/03/…
      • 重用听起来很有希望。我在这里查看示例 7.3jersey.java.net/documentation/latest/message-body-workers.html。这个例子看起来好像我必须为每个 Bean 创建一个MessageBodyWriter(通过调用它MyBeanMessageBodyWriter)。这对我来说是一个糟糕的假设吗?
      • 嗯。也许我可以让我所有的 bean 实现一个接口。然后我可以创建一个像implements MessageBodyWriter&lt;MyBeanInterface&gt; 这样的MessageBodyWriter。事实上,接口可能需要一个 toText() 方法,而 MessageBodyWriter 可以简单地调用它?
      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多