Java 在REST端点上使用throws子句是否被视为糟糕的设计?

Java 在REST端点上使用throws子句是否被视为糟糕的设计?,java,rest,Java,Rest,我想从REST端点抛出异常。然而,我不太熟悉良好的REST设计技术。考虑下面……/P> //note the throws clause @POST public Response saveNewActivity(@HeaderParam("sessionTokenString") String sessionTokenString, Activity activity) throws Exception { Activity result = as.saveNewActivity(ac

我想从REST端点抛出异常。然而,我不太熟悉良好的REST设计技术。考虑下面……/P>
//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();
    }
}
公共类DuplicateDataExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(重复数据异常e){

ErrorMessage ErrorMessage=新的ErrorMessage(“活动名称必须是唯一的。”,“或没有给出我要寻找的答案。

通过异常是个坏主意

从客户机的角度来看,它会导致http 500错误代码,而不会告诉自动程序任何信息

您应该设计代码,试图截获所有可能的错误,并在有效响应中使用适当的错误代码进行回复。如果您的响应是json响应,请使用以下内容:

{
    statusCode: 345,
    errorMessage: 'The error code message'
}

将http状态代码500保留为意外错误。

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


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

任何关于将异常作为好/坏设计抛出的意见都是这种意见,特别是因为处理所有异常的特定方式服务电话中的s提供了
例外标记
。如果你要投否决票并投票删除,请在评论中解释原因好吗?我没有投你反对票。事实上,我投了你反对票。有人投了我否决票,我挠头问为什么;对于投了反对票的两个人,非常感谢!)