映射 WebApplicationExceptions
Mapping WebApplicationExceptions
我想知道 Javax-RS/Jersey ExceptionMapper
class 在映射 WebApplicationExceptions
时的正确用途是什么
我喜欢以下简单的 3 状态范例:
- HTTP 200 OK表示响应成功,完全没有错误;和
- HTTP 404 表示客户端错误;和
- HTTP 500 表示服务器端错误
WebApplicationExceptions
的问题在于它们可能是客户端(403,禁止访问)或服务器端(503 Bad Gateway);因此,它们可能会根据情况映射到 404 或 500。
我正在努力尝试检查 WebApplicationException
以便我可以确定它是客户端还是服务器端。
迄今为止我最好的尝试:
// Groovy pseudo-code
class MyMapper implements ExceptionMapper<Throwable> {
@Override
Response toResponse(Throwable error) {
if(error instanceof WebApplicationException) {
if(isClientSide(error as WebApplicationException)) {
// Return HTTP 404.
} else {
// Return HTTP 500.
}
} else if(error instanceof ClientException) {
// Return HTTP 404.
} else if(error instanceof ServerException) {
// Return HTTP 500.
} else {
// All other throwables. Default to HTTP 500.
}
}
private boolean isClientSide(WebApplicationException webAppExc) {
// TODO: How to make this determination?
}
}
这里有几个concerns/issues:
- 这个
ExceptionMapper
真的会捕获所有 Throwables
(每个Exception
和Error
子class) , 或者只是 Throwables
?;和
- 我可以在
isClientSide(...)
中做什么来确定引发的错误是客户端还是服务器端?假设创建的状态为 FORBIDDEN
的 WebApplicationException
应被视为 "client-side",但创建的状态为 BAD_GATEWAY
不应被视为。
WebApplicationException
和 ExceptionMapper
的用途相似但略有不同。
它们都帮助开发人员设置自定义 HTTP 错误代码和对特定异常发生的响应。
WebApplicationException
主要用于自定义或用户定义的异常;这意味着每当您的应用程序抛出用户定义的异常时,您都可以设置您想要的 HTTP 响应代码以及问题的详细描述,还可以设置 return 类型。
看起来像这样:-
public class UserDefinedExcpetion extends WebApplicationException {
/**
* Create a HTTP 404 Not Found Error as plain text
* whenever a UserDefinedExcpetion happens.
*/
public UserDefinedExcpetion (String yourMessage) {
super(Response.status(Responses.NOT_FOUND).
entity(yourMessage).type("text/plain").build());
}
}
您对应用程序中已经存在的异常(例如用户未定义的异常)使用 ExceptionMapper
,并且在发生这些异常时您希望发送自定义 HTTP 错误响应,其中嵌入了一些详细信息;并设置消息的类型。
这样使用:-
@Provider
public class IOExceptionMapper implements ExceptionMapper<java.io.IOException> {
public Response toResponse(java.io.IOException) {
/** Mapper which maps to IOExcpetion and gets called automatically by the JAXRS runtime when this exception occurs. Throw a 404 when this exception occurs.**/
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}
注意:- 请注意在 jaxrs 运行时注册此映射器的 @Provider 注释。
我想知道 Javax-RS/Jersey ExceptionMapper
class 在映射 WebApplicationExceptions
我喜欢以下简单的 3 状态范例:
- HTTP 200 OK表示响应成功,完全没有错误;和
- HTTP 404 表示客户端错误;和
- HTTP 500 表示服务器端错误
WebApplicationExceptions
的问题在于它们可能是客户端(403,禁止访问)或服务器端(503 Bad Gateway);因此,它们可能会根据情况映射到 404 或 500。
我正在努力尝试检查 WebApplicationException
以便我可以确定它是客户端还是服务器端。
迄今为止我最好的尝试:
// Groovy pseudo-code
class MyMapper implements ExceptionMapper<Throwable> {
@Override
Response toResponse(Throwable error) {
if(error instanceof WebApplicationException) {
if(isClientSide(error as WebApplicationException)) {
// Return HTTP 404.
} else {
// Return HTTP 500.
}
} else if(error instanceof ClientException) {
// Return HTTP 404.
} else if(error instanceof ServerException) {
// Return HTTP 500.
} else {
// All other throwables. Default to HTTP 500.
}
}
private boolean isClientSide(WebApplicationException webAppExc) {
// TODO: How to make this determination?
}
}
这里有几个concerns/issues:
- 这个
ExceptionMapper
真的会捕获所有Throwables
(每个Exception
和Error
子class) , 或者只是Throwables
?;和 - 我可以在
isClientSide(...)
中做什么来确定引发的错误是客户端还是服务器端?假设创建的状态为FORBIDDEN
的WebApplicationException
应被视为 "client-side",但创建的状态为BAD_GATEWAY
不应被视为。
WebApplicationException
和 ExceptionMapper
的用途相似但略有不同。
它们都帮助开发人员设置自定义 HTTP 错误代码和对特定异常发生的响应。
WebApplicationException
主要用于自定义或用户定义的异常;这意味着每当您的应用程序抛出用户定义的异常时,您都可以设置您想要的 HTTP 响应代码以及问题的详细描述,还可以设置 return 类型。
看起来像这样:-
public class UserDefinedExcpetion extends WebApplicationException {
/**
* Create a HTTP 404 Not Found Error as plain text
* whenever a UserDefinedExcpetion happens.
*/
public UserDefinedExcpetion (String yourMessage) {
super(Response.status(Responses.NOT_FOUND).
entity(yourMessage).type("text/plain").build());
}
}
您对应用程序中已经存在的异常(例如用户未定义的异常)使用 ExceptionMapper
,并且在发生这些异常时您希望发送自定义 HTTP 错误响应,其中嵌入了一些详细信息;并设置消息的类型。
这样使用:-
@Provider
public class IOExceptionMapper implements ExceptionMapper<java.io.IOException> {
public Response toResponse(java.io.IOException) {
/** Mapper which maps to IOExcpetion and gets called automatically by the JAXRS runtime when this exception occurs. Throw a 404 when this exception occurs.**/
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}
注意:- 请注意在 jaxrs 运行时注册此映射器的 @Provider 注释。