当前位置: 首页 > 知识库问答 >
问题:

在RESTendpoint上使用throws子句是否被认为是一种糟糕的设计?[副本]

万俟超
2023-03-14

我想从我的RESTendpoint抛出异常。不过,我对好的REST设计技术还不是太熟悉。请考虑以下内容...

//note the throws clause
@POST
public Response saveNewActivity(@HeaderParam("sessionTokenString") String sessionTokenString, Activity activity) throws Exception {
    Activity result = as.saveNewActivity(activity);
    if (result == null) {
        throw new DuplicateDataException("blah blah blah");
    }
    return Response.ok(result).build();
}

而不是处理异常和显式地只返回响应

@POST
public Response saveNewActivity(@HeaderParam("sessionTokenString") String sessionTokenString, Activity activity) {
    try {
        Activity result = as.saveNewActivity(activity);
        if (result == null) {
            throw new DuplicateDataException("blah blah blah");
        }
        return Response.ok(result).build();
    } catch (Exception e) {
         return Response.status(Response.Status.SOME_STATUS).build();
    }
}

我可以使用ExceptionMapper映射DuplicateDataException,如下所示

public class DuplicateDataExceptionMapper implements ExceptionMapper<DuplicateDataException> {

    @Override
    public Response toResponse(DuplicateDataException e) {
        ErrorMessage errorMessage = new ErrorMessage ("Activity names must be unique.", <HttpStatusNumber>, "<add documentation here>");
        return Response.status(Status.NOT_FOUND).entity(errorMessage).build();
    }
}

虽然最终还是会返回响应,但是处理异常的一种方式(不管它们是否是RuntimeExceptions)是优先于另一种方式,还是这并不重要?我从来没有在RESTendpoint上看到过throws语句,这就是为什么我问。

共有1个答案

弘承业
2023-03-14

如果父类正在捕获抛出的异常并返回适当的HTTP响应错误代码(4xx),那么初始代码就可以了。

如果没有父类捕获这些,使它们变成4xx而不是500,那么您的代码--将响应代码更改为适合这个特定错误的代码--似乎是一个很好的主意。

 类似资料:
  • 其他人告诉我,在代码中使用名称空间std;编写

  • 问题内容: 在我的一个项目中,我有两个“数据传输对象” RecordType1和RecordType2,它们从RecordType的抽象类继承。 我希望两个RecordType对象在“ process”方法中由相同的RecordProcessor类处理。我的第一个想法是创建一个通用的处理方法,该方法将两个特定的处理方法委托给以下人员: 我读过Scott Meyers在 Effective C ++

  • < b >想改进这个问题?通过编辑此帖子添加详细信息并澄清问题。 我很好奇java.util.random是否有种子具有奇怪/令人惊讶的属性。这几乎没有实际用途,但我仍然很好奇。 编辑:奇怪/令人惊讶的属性指的是重复值或非典型模式。

  • 举例说明 Laravel 文档和网上的各种教程,会教授我们一个任务可以使用好几种方法来完成。对于框架设计来说,灵活是件好事,能提供给开发者不同的选项,能让框架适用更多的用户场景。但是对于团队的协同开发来说,大部分时候,更多的选项反而是累赘。 下面来举一个例子说明,假如你在为项目开发 用户授权 相关功能,仅 注册用户权限 这块你就会有以下三个选项: 选项 1. 使用闭包: 你可以在 AuthServ

  • 编译器必须为constexpr的不同路径生成多个函数,这取决于函数的调用方式。所以也许它在使用过载分辨率。 被接受的建议没有提到“sfinae”或“过载分辨率”。 所以我很好奇这两个概念是否适用于“constexpr if”。

  • 我想问一下,在8位内存字段上使用CMPXCHG指令是否在任何方面都比在32位字段上使用它更糟糕。 我用的是C11标准温度。h来实现两种同步方法。