Java 映射WebApplicationExceptions
我想知道Javax RS/JerseyJava 映射WebApplicationExceptions,java,rest,jersey,jax-rs,dropwizard,Java,Rest,Jersey,Jax Rs,Dropwizard,我想知道Javax RS/Jerseyexceptionapper类在映射WebApplicationExceptions 我喜欢以下简单的三状态范例: HTTP 200 OK表示响应成功,没有任何错误;及 HTTP 404表示客户端错误;及 HTTP 500表示服务器端错误 WebApplicationExceptions的问题是它们可能是客户端(403,禁止)或服务器端(503坏网关);因此,根据情况,它们可能映射到404或500 我正在努力检查WebApplicationExcepti
exceptionapper
类在映射WebApplicationExceptions
我喜欢以下简单的三状态范例:
- HTTP 200 OK表示响应成功,没有任何错误;及
- HTTP 404表示客户端错误;及
- HTTP 500表示服务器端错误
WebApplicationExceptions
的问题是它们可能是客户端(403,禁止)或服务器端(503坏网关);因此,根据情况,它们可能映射到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?
}
}
//Groovy伪代码
类MyMapper实现ExceptionMapper{
@凌驾
响应响应(可丢弃错误){
if(WebApplicationException的错误实例){
if(iClientSide(错误为WebApplicationException)){
//返回HTTP404。
}否则{
//返回HTTP500。
}
}else if(客户端异常的错误实例){
//返回HTTP404。
}else if(服务器异常的错误实例){
//返回HTTP500。
}否则{
//所有其他可丢弃文件。默认为HTTP 500。
}
}
专用布尔值iClientSide(WebApplicationException WebAppException){
//TODO:如何做出这个决定?
}
}
因此,这里有一些关注/问题:
- 这个
真的会捕获所有的exceptionapper
(每个Throwables
和Exception
子类),还是只捕获Error
?;及Throwables
- 在
内部我可以做什么来确定抛出的错误是源于客户端还是服务器端?让我们假设一个状态为isClientSide(…)
禁止的
创建的
应该被视为“客户端”,但一个状态为WebApplicationException
创建的不应该被视为“客户端”坏的\u GATEWAY
WebApplicationException
和exceptionapper
具有类似但略有不同的用途
它们都有助于开发人员设置自定义HTTP错误代码,并在出现特定异常时做出响应
WebApplicationException
主要用于自定义或用户定义的异常;这意味着每当应用程序抛出用户定义的异常时,您都可以设置所需的HTTP响应代码,并详细说明问题所在,还可以设置返回类型
看起来像这样:-
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());
}
}
@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();
}
}
在应用程序中已经存在的异常(例如用户未定义的异常)上使用exceptionapper
,并且在出现这些异常时,您希望发送一个自定义HTTP错误响应并嵌入一些详细信息;以及设置消息的类型
像这样使用它:-
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());
}
}
@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();
}
}
@Provider
公共类IOExceptionMapper实现ExceptionMapper{
公共响应响应(java.io.IOException){
/**映射到IOExcpetion并在发生此异常时由JAXRS运行时自动调用的映射器。发生此异常时抛出404**/
返回Response.status(404).entity(例如getMessage()).type(“text/plain”).build();
}
}
注意:-注意@Provider注释,它在jaxrs运行时注册了此映射程序。我不明白客户端错误是什么意思?200404500是从服务器端生成的错误。404,你说的“指示客户端错误”是当服务器找不到请求的资源时抛出的服务器端错误。当然,谢谢@Abhin(+1),让我澄清一下。是的,所有这些错误都从服务器发送回客户端。当我说“客户端错误”时,我的意思是请求本身是错误的。可能请求的身份验证失败,或者客户机的“API令牌”不足,在购买更多API令牌之前不允许发出请求。当我说“服务器端错误”时,我的意思是请求itelf有效/良好,但是服务器上的一些错误阻止了服务器响应它。这有意义吗?是的。注意认证失败;请求进入服务器并失败;在“API令牌”示例中,请求转到服务器以检查他们是否可以购买更多;检查条件并失败。两个请求都进入服务器并失败;Webapplicationexception和mapper可用于映射这些故障,并为它们生成详细的响应。检查我下面的答案。啊,谢谢@Light(+1)-这很有道理。如果您不介意的话,我可以快速跟进一下:我知道最好的做法可能是不实现
异常apper
,但我可以说我忽略了这一点,并无论如何创建了一个……服务器是否会在任何时候(包括WebApplicationExceptions
)抛出一次性/错误/异常时调用它?再次感谢!嗨,是的。通过@Provider注释,您可以将其插入jax rs运行时。因此,每当出现异常时,您的映射程序都会被调用,以便您自定义响应。如果根据定义在Throwable上使用映射器,它应该映射到任何时候发生的所有错误和异常;对