开发者社区 问答 正文

如果路由不存在,如何配置Spring Boot引发404错误?

所以我在控制器中有一堆嵌套的路由。如果特定的嵌套路由不存在,我想确保应用程序引发错误。现在,如果嵌套级别大于2,则应用程序返回,null而不是抛出错误,指出找不到路由。

例:

@RestController @RequestMapping(value="v1/") public class EmployeeController {

@Autowired
EmployeeRepository employeeRepository;


// Get Token Info
@RequestMapping(value = "read/tokenInfo", method =  RequestMethod.GET)
public Token getTokenInfo(@AuthenticationPrincipal Token token) {
    return token;
}


// List of all employees.
@GetMapping(path = "read/list")
public List<Employee> getAllEmployees() {
    return employeeRepository.findAll();
}

在上面的代码中,假设该路由 v1/read/tokenInfo具有3个分段-v1,read和tokenInfo。如果我输错了路线,然后尝试类似的操作- v1/read/tokeninfosss而不显示错误,它将返回200OK并null显示消息。

响应: 响应

但是,如果该路线只有2个级别-如下所示-

@RestController @RequestMapping(value="v1/") public class EmployeeController {

@Autowired
EmployeeRepository employeeRepository;

// Get Token Info
@RequestMapping(value = "tokenInfo", method =  RequestMethod.GET)
public Token getTokenInfo(@AuthenticationPrincipal Token token) {
    return token;
}

现在,如果我致电- v1/tokenInfosss,则会引发错误 -404错误: 404错误

我还配置了以下安全性-

@Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests()
.antMatchers("/local/").permitAll() .antMatchers("/v1/read/").hasAuthority("Display") .antMatchers("/v1/modify/**").hasAuthority("Update") .anyRequest().authenticated() .and() .oauth2ResourceServer() .jwt() .jwtAuthenticationConverter(getJwtAuthenticationConverter()); } 任何想法如何配置此404错误?

展开
收起
被纵养的懒猫 2019-10-08 17:20:00 715 分享 版权
阿里云 AI 助理回答

在Spring Boot应用中,确保对不存在的嵌套路由引发404错误通常涉及到调整Spring MVC配置以正确处理未找到的请求。以下是一些建议来解决你的问题:

  1. 全局异常处理器:你可以通过实现@ControllerAdvice来定义一个全局异常处理器,捕获并自定义特定异常的响应。对于路由不存在的情况,你需要关注的是org.springframework.web.servlet.NoHandlerFoundException
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity handleNotFoundError(NoHandlerFoundException ex, WebRequest request) {
        // 自定义错误信息或日志记录
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Endpoint not found.");
    }
}
  1. 确保Spring Security配置允许404错误传递:有时候,安全配置可能会拦截404错误页面,确保你的Spring Security配置没有无意中阻止了这些错误消息的正常返回。你可能不需要对此进行更改,但要确认这一点。

  2. 检查资源路径和静态资源处理:虽然这不太可能是你的问题所在,但确保Spring Boot的静态资源处理没有意外地“吃掉”了那些本应导致404错误的请求。在application.propertiesapplication.yml中检查与静态资源相关的配置。

  3. 启用 TRACE 日志级别:为了更深入地了解请求是如何被处理的,可以临时将Spring MVC和Spring Security的日志级别设置为TRACE。这可以帮助你跟踪请求从接收到处理的完整流程,从而找出为何某些请求没有正确返回404错误。

  4. 验证@RequestMapping注解的使用:确保所有端点都正确使用了@RequestMapping及其变体(如@GetMapping、@PostMapping等),并且没有不匹配的路径或方法级别的映射覆盖了预期的错误行为。

如果以上步骤都不能解决问题,可能需要更详细地检查你的应用程序配置,特别是与视图解析器、异常处理以及Spring Security相关部分,以确定是否有其他配置干扰了正常的错误处理流程。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答