当前位置: 首页 > 知识库问答 >
问题:

如何使自定义异常处理程序正常工作

陆展
2023-03-14

我想为我的应用程序使用自定义异常处理程序。但是,它不能正常工作。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    if (!bAuthorize) {
        chain.doFilter(request, response);
        return;
    }

    HttpServletRequest req = (HttpServletRequest) request;

    String namespace = getPathParamFromRequest(req, NAMESPACE_PATH_PREFIX);
    String userId =  getPathParamFromRequest(req, USER_PATH_PREFIX);


    AuthContext auth = null;
    RequestPathContext rpc = pathsList.getMatchingContext(req.getRequestURI(), HttpMethod.valueOf(req.getMethod()));
    if (rpc != null)
        auth = rpc.getAuthContext();

    if (auth != null) {
        // Authentication process
    } else {
        throw new UnauthorizedException();
    }
}

ApplicationExceptionHandler.java

public class ApplicationExceptionHandler {
  @ExceptionHandler(UnauthorizedException.class)
  public ResponseEntity<ErrorEntity> applicationxception(final UnauthorizedException e) {
    ErrorEntity errorEntity = new ErrorEntity(e.getNumericErrorCode(), e.getErrorCode(), e.getErrorMessage());
    return new ResponseEntity<>(errorEntity, HttpStatus.valueOf(e.getHttpStatus()));
  }
}

authFilterRegistration.java

@Configuration
public class AuthFilterRegistration {

  @Autowired
  private ApplicationContext context;

  @Bean
  public FilterRegistrationBean<AuthenticationFilter> loggingFilter() {
    FilterRegistrationBean<AuthenticationFilter> registrationBean
            = new FilterRegistrationBean<>();

    registrationBean.setFilter(context.getBean(AuthenticationFilter.class));
    registrationBean.addUrlPatterns( "/public/*");

    return registrationBean;
  }

  @Bean
  public AuthenticationFilter getAuthFilter() {
    return new AuthenticationFilter();
  }

  @Bean
  public ApplicationExceptionHandler getErrorHandler() {
    return new ApplicationExceptionHandler();
  }

}

ErrorEntity.java

public class ErrorEntity extends BaseErrorEntity {

  String errorMessage;

  Map<String, String> messageVariables;

  public ErrorEntity() {
  }

  public ErrorEntity(int numericErrorCode, String errorCode, String errorMessage) {
    this(numericErrorCode, errorCode, errorMessage, null);
  }

  public ErrorEntity(int numericErrorCode, String errorCode, String errorMessage, Map<String, String> messageVariables) {
    this.numericErrorCode = numericErrorCode;
    this.errorCode = errorCode;
    this.errorMessage = errorMessage;
    this.messageVariables = messageVariables;
  }

}

使用这些代码,我希望有一个像这样的异常错误

{
  "numericErrorCode": 2001,
  "errorCode": "errors.net.myproject.platform.unauthorized",
  "errorMessage": "unauthorized"
}

这是errorEntity实例,但我得到了以下输出

{
  "timestamp": "2019-02-01T04:41:14.337+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "unauthorized",
}

从示例中可以清楚地看出,我无法完全覆盖默认的Java异常。仅更改成功的消息部分。我错过什么了吗?

共有1个答案

章涵蓄
2023-03-14

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class ApplicationExceptionHandler extends ResponseEntityExceptionHandler {

@ResponseBody
@ExceptionHandler(UnauthorizedException.class)
public ResponseEntity<ErrorEntity> applicationxception(final UnauthorizedException e) {
    ErrorEntity errorEntity = new ErrorEntity(e.getNumericErrorCode(), e.getErrorCode(), e.getErrorMessage());
    return new ResponseEntity<>(errorEntity, HttpStatus.valueOf(e.getHttpStatus()));
}

@ResponseBody
@ExceptionHandler(RetrievedProfileException.class)
public ResponseEntity<ErrorEntity> applicationexception(final RetrievedProfileException e) {
    ErrorEntity errorEntity = new ErrorEntity(e.getNumericErrorCode(), e.getErrorCode(), e.getErrorMessage());
    return new ResponseEntity<>(errorEntity, HttpStatus.valueOf(e.getHttpStatus()));
}

我只是扩展了这个类org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler,因为它的pre-requsite

其次,我使用了@controlleradvice

最后我使用了@responsebody

以这种方式使用异常处理程序,并且应该以这种方式重写异常。

 类似资料:
  • 我正在用Spring Boot开发一个rest应用程序。此应用程序有一个自定义筛选器,只允许在某些请求下访问。如果用户需要特定的资源,筛选器将抛出异常。如何在全局级别处理此筛选器中生成的所有异常? 我尝试了注释,但不起作用。

  • 如果Spring批处理作业业务逻辑出现ArrayIndexOutOfBoundsException,我必须从我的自定义映射器FieldSetMapper of reader FlatFileItemReader中跳过一个自定义异常(CSVFieldMappingException)。为此,我添加了作业步骤的配置,如下所示。 但这不起作用,因为每当我抛出自定义RunTimeException时,就会

  • 我使用的是Nifi 0.4.1版本。我写自定义代码转换CSV到avro格式。我已经创建了类文件,并能够生成nar文件。将nar文件放置在lib目录中,并重新启动nifi服务器。 任何帮助都很感激.. 谢谢,

  • 我的要求是,如果post请求的JSON无效,我将需要发送400个HTTP响应代码,如果任何字段不可解析,返回状态代码将为422。例如,post请求可以是: Dto类提供如下:, 这是发出POST请求的控制器, 如果“金额”是,比如说,“sfdfd”,这不是大小数,我们应该提供422。但如果“金额”为“-12.3343”,则这是约束验证错误,但数据有效且可分析。所以我们不能拥有422。 这是我的异常

  • 我有一个验证令牌的自定义筛选器tokenLoginFilter 我的Spring安全 令牌登录过滤器 在authenticationmanager . authenticate调用中,我从TokenAuthenticationProvider中抛出了BadCredentialsException 令牌身份验证提供程序 Tomcat将此BadCredentialsException解释为错误代码50

  • 我正试图自己解决参数问题。 我可以很容易地从NativeWebRequest获取输入参数,并将它们分派到相应的自定义@Param注释参数中。 问题是我还想在这方面做一些语法检查/验证。但如果我在“resolveArgument”中抛出异常,则会向用户显示完整的堆栈跟踪。这将是过度和不安全的。我只想向用户返回一条JSON格式的消息,以显示哪个输入参数语法有错误。