【问题标题】:How to return a string in response that have @Produces(MediaType.APPLICATION_JSON)?如何返回具有@Produces(MediaType.APPLICATION_JSON)的字符串作为响应?
【发布时间】:2018-10-20 12:35:39
【问题描述】:
@GET
@Path("/paises/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response findCuntryList(@PathParam("id")int id){
    try{
    ArrayList<Country> lista = new ArrayList<>();
    for(int i=0; i<10 ;i++){
        Country c = new Country();
        c.setId(i);
        c.setName("country"+i);
        c.setCode("countryIsoCode"+i);
        c.setRegion("region"+i);
        lista.add(c);
        }

    Country co = lista.stream().filter(x -> x.getId()==id).findAny().get();
    if(id > lista.size()-1) throw new Exception("That id is not correct");
    return Response.ok(co).build();
    }catch(Exception e){

        return Response.status(404).entity(e.getMessage()).build();
        }
    }

当我没有异常时,我想返回一个 json,但是当我有它时,我需要返回一个带有异常消息的字符串,但是这个 json 解析的丢弃错误。

【问题讨论】:

  • 你试过查询参数吗??
  • @RajanDesai 不,抱歉,我正在学习这项新技术。你能教我或放一些代码吗?谢谢
  • 对我来说..解决这个问题的正确方法是在 catch 下使用 throw 并使用 @Provider创建 ExceptionHandler 类> 对于那个特殊的例外。

标签: java json maven jersey grizzly


【解决方案1】:

单引号字符串是有效的 JSON。所以你可以使用:

return Response.status(404).entity("\"" + e.getMessage() + "\"").build();

不过,我建议您改为返回 JSON 对象。它使您可以灵活地返回有关错误的额外元数据。

你可以使用Map&lt;String, Object&gt;:

Map<String, Object> errorDetails = new HashMap<>();
errorDetails.put("message", e.getMessage());
return Response.status(404).entity(errorDetails).build();

或者为错误详情创建一个类:

public class ErrorDetails {

    private String message;

    ...
}
ErrorDetails errorDetails = new ErrorDetails;
errorDetails.setMessage(e.getMessage());
return Response.status(404).entity(errorDetails).build();

如需报告 HTTP API 中的问题,请查看RFC 7807

【讨论】:

  • 现在我没有解析错误,但没有显示我想要的字符串
  • 是的,谢谢你是个了不起的人。使用该代码,我意识到异常消息有问题
【解决方案2】:

为什么你对使用 WILDCARD 表达式不感兴趣,

 @Path("getSupportEmail/{broadcastMprId}")
    @GET
    @Produces(MediaType.MEDIA_TYPE_WILDCARD)
    public Response getSupportEmailByBroadcastMprId(@PathParam("broadcastMprId") Integer broadcastMprId) {
        return Response.ok(broadcastMprBean.getSupportEmailByBroadcastMprId(broadcastMprId)).build();
    }

【讨论】:

    【解决方案3】:

    根据您提供的示例代码和此问题的标签,您最好使用异常处理程序,而不是捕获并返回手工制作的消息,并让您的 @GET 方法返回您的域对象。 JAX-RS 库(在这种情况下是泽西岛?)会将其序列化为 JSON,因为您的方法使用 APPLICATION_JSON 进行了注释。

    https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-en/cn/part1/chapter7/exception_handling.html

    专门针对泽西岛:https://howtodoinjava.com/jersey/jax-rs-jersey-custom-exceptions-handling-with-exceptionmapper/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多