Java 如何验证路径变量类型:错误400,参数错误,服务器中没有日志,没有错误消息

Java 如何验证路径变量类型:错误400,参数错误,服务器中没有日志,没有错误消息,java,spring-boot,Java,Spring Boot,我有一个端点: @GetMapping("/v2/tw/{id}") public TwDto getTw(Authentication auth, @PathVariable Long id) { } 当我想用参数类型错误的Postman获取数据时,我想让一些日志在服务中,我想得到一些验证错误。怎么做 我应该添加例如@NumberFormat?它不起作用 我使用@ControllerAdvice,我的项目很旧,所有东西都经过了正确的验证,但这种情况对我来说很奇怪……您可以

我有一个端点:

@GetMapping("/v2/tw/{id}")
public TwDto getTw(Authentication auth, @PathVariable Long id) {
}
当我想用参数类型错误的Postman获取数据时,我想让一些日志在服务中,我想得到一些验证错误。怎么做

我应该添加例如
@NumberFormat
?它不起作用


我使用
@ControllerAdvice
,我的项目很旧,所有东西都经过了正确的验证,但这种情况对我来说很奇怪……

您可以使用注释@Valid作为参数,并使用ConstraintViolationException处理异常。有关更多信息和详细信息,请参见此处:

我想我找到了解决问题的方法-与其扔400块来传达一些信息,也许添加以下内容就足够了:

@GetMapping("/v2/tw/{id:\d+}")
public TwDto getTw(Authentication auth, @PathVariable Long id) {
}

然后我得到了
404error Not found
,我认为这种方法比在没有任何消息的情况下返回400个错误要好。。。您觉得怎么样?

您可以编写自定义异常处理程序

  • 这是您的自定义实体

公共类异常{
私有最终字符串消息;
私有最终HttpStatus HttpStatus;
公共ApiException(字符串消息,HttpStatus HttpStatus){
this.message=消息;
this.httpStatus=httpStatus;
this.timestamp=时间戳;
}
公共字符串getMessage(){
返回消息;
}
公共HttpStatus getHttpStatus(){
返回httpStatus;
}
}
  • 这是您的异常类

公共类ApiRequestException扩展了RuntimeException{
公共APIRestException(字符串消息){
超级(信息);
}
公共APIRestException(字符串消息,可丢弃原因){
超级(消息、原因);
}
}
  • 最后是ApiExceptionHandler

也许你应该把
id
参数作为一个对象,然后在你的代码中检查验证。@nav和hmmm也许这就是解决方案!然后我可以抛出将在ControllerAdvice中捕获的任何Exception,但我不记得是否使用了对象参数类型而不是Long/Integer。。。也许有更好的解决方案?时间已经过去了,也许最近有些事情发生了变化,但是您无法验证类型。这回答了你的问题吗?恐怕我有PathVariable,不是RequestParam。。。Valid不起作用,我仍然只收到400个错误,没有任何日志,没有任何消息
@ControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler(value = {ApiRequestException.class})
    public ResponseEntity<Object> handleApiRequestException(ApiRequestException e) {
        HttpStatus badRequest = HttpStatus.BAD_REQUEST;
        ApiException apiException = new ApiException(e.getMessage(), badRequest));
        return new ResponseEntity<>(apiException, badRequest);
    }
}