首页 > 解决方案 > REST (Jersey):在返回类型不是 Response 的方法中返回响应中的错误

问题描述

我有一些通过 ajax 调用的 Web 应用程序的 REST 方法。它们中的大多数返回 DTO 列表,因此方法的返回类型被声明为 List,从列表中生成 JSON。一切正常,但现在我需要在其中一种方法中区分空列表(对前端有效)和空列表。

这是相关方法的简单代码:

@GET
@Path("getComparedItems")
@Produces(MediaType.APPLICATION_JSON)
public List<ItemDTO> getComparedItems() {
    List<ItemDTO> comparedItems = itemsService.getComparedItemsDTOList();
    //List populated with updated/new items.
    //If empty: no changes
    //If null: error, probably obtaining external data
    if (comparedItemsPlayers != null) {
        return comparedItems;
    } else {
        //TODO...
    }
}

所以,关于 TODO 块,它应该返回一个错误:

我可以返回 null(它变成 204 No content)并在 ajax 调用中处理该代码,但我更愿意避免这种情况,因为 ajax 调用目前仅处理 5xx 错误(并且因为 204 不是错误顺便说一句)。我可以抛出 WebApplicationException 或其他异常,因此前端会意识到 500 错误,但我不希望 rest 方法中出现异常,或者至少在没有显式构建错误的情况下不希望出现异常。

所以,我想做的事情是返回一个像这样的响应:

return Response.serverError().build();

这样做,迫使我将方法的返回类型更改为响应。

只是出于好奇,我想知道是否有一种方法可以将返回类型保持为 List,并构建一个与该错误兼容的响应。我阅读了它,并找到了一些方法将列表作为通用实体放入响应中:

GenericEntity<List<ItemDTO>> respEntity =
        new GenericEntity<List<ItemDTO>>(comparedItems) {};
return Response.serverError().entity(respEntity).build();

但是(我应该注意到)这些类型仍然不兼容。那么,我怎样才能将列表作为列表返回但指定服务器错误?无论如何,在这些情况下是否有办法或方法返回类型必须更改?

谢谢你。

标签: javarestjersey

解决方案


推荐阅读