【问题标题】:How to return "text/plain" OR "application/json" in Java REST webservice?如何在 Java REST Web 服务中返回“text/plain”或“application/json”?
【发布时间】:2017-07-19 18:52:15
【问题描述】:

我有一个返回文件文本的网络服务。如果出现问题,我想发回一个描述错误的 json 对象。我已经读到@Produces 注释中可能有多个 MediaType,但我无法让它工作(它只与第一个 MediaType 一起使用)。我可能需要一种方式来说“在此处生成文本,在此处生成 json”。

@GET
//@Produces( {MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON} ) doesn't work either.
@Produces( MediaType.TEXT_PLAIN )
@Path( "/{filename}" )
public Response get( @PathParam( "filename" ) String filename ) {

    String text;

    try {
        text = service.getFileText( service.getDirectory(), filename );
    }
    catch ( MyFileNotFoundException ex ) {
        //Make a JSON object describing the error.
        return ErrorResponder.sendErrorObject(ex.getMessage(), Response.Status.BAD_REQUEST);
    }

    //Send back plain text.
    return Response.ok().entity( text ).build();
}

谢谢。

ErrorResponder.sendErrorObject 目前是这样返回的;将尝试 .type() 函数:

return Response.status( status ).entity( errorObject ).build();

【问题讨论】:

  • 什么是ErrorResponder
  • 它只是一个帮助类,它为错误创建一个 json 对象。例如:{“错误”:[“A”,“B”,“C”]}。我能做的就是把它作为一个字符串发回,让客户端处理它,但它看起来很奇怪。
  • sendErrorObject() 方法是否将媒体类型设置为 JSON,例如像这样? Response.status(Response.Status.BAD_REQUEST).type(MediaType.APPLICATION_JSON).entity(jsonText).build() --- 但总的来说,没有看到 ErrorResponder 做了什么,您希望我们如何告诉您为什么它不起作用?
  • 不,它不会那样做。我会试试的。我没有把它放在那里,因为我认为它已经足够抽象了(“它发送 JSON”)并且容器处理了它,但显然我错了。
  • 如果@Produces列出了多个类型,它会使用内容协商规则选择一个类型,如果你给entity()调用一个对象,它会尝试根据协商类型。由于您希望text/plain 用于正常响应,因此您应该只在@Produces 中列出它,如果您决定发送其他媒体类型,则覆盖它。

标签: java json web-services rest


【解决方案1】:

可以配置多个 MIME 类型,如下所示

@Produces({"text/plain", "application/json"})

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2013-08-09
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多