Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射WebApplicationExceptions_Java_Rest_Jersey_Jax Rs_Dropwizard - Fatal编程技术网

Java 映射WebApplicationExceptions

Java 映射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

我想知道Javax RS/Jersey
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上使用映射器,它应该映射到任何时候发生的所有错误和异常;对