Saš*_*šo5 2 java servlets jax-rs custom-exceptions
我有一个资源:
@GET
@Path("/print-order")
@Produces("application/pdf")
public byte[] printOrder(@QueryParam("id") Long orderId) {
return ...;
}
Run Code Online (Sandbox Code Playgroud)
...这可能会引发与用户相关的错误,并且必须显示为HTML页面。所以我实现了一个,ExceptionMapper但我不知道如何获取@Produces("application/pdf")被调用资源的注释的值。
@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
@Override
public Response toResponse(CustomException exception) {
if (contentType = "application/pdf")
... html respone
else
... entity response
}
}
Run Code Online (Sandbox Code Playgroud)
我在Jersy 1.12实现中使用JAX-RS 1.x(jsr311),但希望拥有独立于实现的解决方案。
您可以向中注入不同的上下文对象,ExceptionMapper以获取有关其处理的请求的更多信息。根据HTTP的Accept标头确定客户端期望的内容类型很方便(在此处了解更多信息)。
以下示例说明了如何ExceptionMapper根据AcceptAPI客户端指定(或未指定)的标头使用不同的格式进行响应。
@Provider
public class CustomExceptionMapper implements ExceptionMapper<CustomException> {
// Inject headers of the request being processed
@Context
private HttpHeaders headers;
// or even all the request details
@Context
private HttpServletRequest request;
@Override
public Response toResponse(CustomException exception) {
List<MediaType> acceptedTypes = headers.getAcceptableMediaTypes();
if (acceptedTypes.contains(MediaType.APPLICATION_JSON)) {
// respond with entity
} else {
// respond with HTML
}
}
}
Run Code Online (Sandbox Code Playgroud)
不过,您最初的想法可以实现。您可以注入HttpServletRequest资源类,并使用setAttribute()方法application/pdf在当前请求的上下文中存储字符串。稍后可以ExceptionMapper使用getAttribute()方法获得它。但是除非绝对必要,否则我不建议您这样做。它在代码的各个组件之间引入了不太明显的依赖关系。
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |