JAX-RS / Jersey如何自定义错误处理?

问题:

我正在使用泽西学习JAX-RS(又名JSR-311)。我已经成功地创建了一个根资源,并且正在使用参数:

@Path("/hello")
public class HelloWorldResource {

    @GET
    @Produces("text/html")
    public String get(
        @QueryParam("name") String name,
        @QueryParam("birthDate") Date birthDate) {

         // Return a greeting with the name and age
    }
}

这可以很好地处理当前语言环境中由Date(String)构造函数理解的任何格式(如YYYY / mm / dd和mm / dd / YYYY)。但是,如果我提供一个无效或不明白的值,我会得到404回复。
例如:
class=”lang-none prettyprint-override”>

GET /hello?name=Mark&birthDate=X

404 Not Found

如何自定义此行为?也许是一个不同的响应代码(可能是“400错误请求”)?如何记录错误?也许在自定义标题中添加问题描述(“日期格式错误”)以帮助进行故障排除?或返回一个完整的错误响应与细节,连同5xx状态代码?

回答:

使用JAX-RS定制错误处理行为有几种方法。这里有三个更简单的方法。
第一种方法是创建扩展WebApplicationException的Exception类。
例:

public class NotAuthorizedException extends WebApplicationException {
     public NotAuthorizedException(String message) {
         super(Response.status(Response.Status.UNAUTHORIZED)
             .entity(message).type(MediaType.TEXT_PLAIN).build());
     }
}

并且抛出这个新创建的异常你简单地:

@Path("accounts/{accountId}/")
    public Item getItem(@PathParam("accountId") String accountId) {
       // An unauthorized user tries to enter
       throw new NotAuthorizedException("You Don't Have Permission");
}

请注意,您不需要在throws子句中声明该异常,因为WebApplicationException是运行时异常。这将返回401响应给客户端。
第二个更简单的方法是直接在代码中构造WebApplicationException的一个实例。只要您不必实现自己的应用程序异常,此方法就可以工作。
例:

@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
   // An unauthorized user tries to enter
   throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}

这个代码也返回一个401给客户端。
当然这只是一个简单的例子。如果需要,您可以使异常复杂得多,您可以生成所需的http响应代码。
另一种方法是将一个现有的Exception(或许是一个ObjectNotFoundException)包含在一个小的包装器类中,该类实现了使用@Provider注释注释的ExceptionMapper接口。这告诉JAX-RS运行时,如果引发了包装的异常,则返回ExceptionMapper中定义的响应代码。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: JAX-RS / Jersey how to customize error handling?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

34 + = 35