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

Spring数据需要验证

闾丘博
2023-03-14

我尝试使用@ControllerAdvise+@ExceptionHandler来捕获ConstraintViolationException,但是它似乎是以前捕获的,抛出的是TransactionSystemException。

验证数据是非常基本的事情,但出于某种原因,在搜索了很多次之后,我还没有找到解决方案。

编辑:显示代码:

@ControllerAdvice
public class ConstraintViolationExceptionHandler extends  ResponseEntityExceptionHandler {

    @ExceptionHandler({ ConstraintViolationException.class })
    public ResponseEntity<Object> handleConstraintViolationException(
      Exception ex, WebRequest request) {

          return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
    }
}
@ControllerAdvice
public class ConstraintViolationExceptionHandler extends  ResponseEntityExceptionHandler {

    @ExceptionHandler({ TransactionSystemException .class })
    public ResponseEntity<Object> handleConstraintViolationException(
      Exception ex, WebRequest request) {

          return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
    }
}

共有1个答案

范哲
2023-03-14

您可以通过ControllerAdvision处理ConstraintViolationException,我已经试过了,它工作得很好,请找到下面的代码片段以供参考。

user.java

@Entity
@Getter
@Setter

public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private String name;

@NotNull
private String surname;
}

userrepository.java

@RepositoryRestResource
public interface UserRepository extends JpaRepository<User, Long> {
}
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<?> handlerException(ConstraintViolationException e) {
        final List<Object> errors = new ArrayList<>();
        e.getConstraintViolations().stream().forEach(fieldError -> {
            Map<String, Object> error = new HashMap<>();
            error.put("path", String.valueOf(fieldError.getPropertyPath()));
            error.put("messgae", fieldError.getMessage());
            errors.add(error);
        });
        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
        Map<String, Object> body = new HashMap<>();
        body.put("error", errors);
        return new ResponseEntity<>(body, httpStatus);
    }
}
curl --location --request POST 'http://localhost:8080/users' \
--header 'Content-Type: application/json' \
--data-raw '{}'
Status: 400 BAD REQUEST
{"error":[{"path":"surname","messgae":"must not be null"},{"path":"name","messgae":"must not be null"}]}
 类似资料:
  • 当我重新启动redis时,会导致java.util.concurrent。ExecutionException:io.莴苣.core。RedisCommandExecutionException:不需要身份验证。为什么使用这样的版本会出现问题

  • 我试图弄清楚如何配置一个方法,使其不在使用Spring的事务中运行。我读到Spring数据存储库默认情况下激活其方法中的事务行为。我不想要这个事务,因为我有许多对存储库的“保存”调用,并且每个调用都是独立的。我认为为每个对存储库方法的调用创建一个事务会降低代码和应用程序的性能。所以: 这是可能的还是每个服务或dao方法都必须在一个事务中运行? 如果有,为什么? 如果可能,如何配置方法不在事务中运行

  • 问题内容: 以下是我的代码段。我想使用angular来验证我的下拉菜单。 有效表示: 有效值可以是“选择服务”以外的任何值,这是我的默认值。 像其他ASP.net的下拉列表一样,需要字段验证器DefaultValue =“ 0”,因此在这里,我的下拉列表将与服务绑定,我想选择除“选择服务”之外的所有其他值。 问题答案: 您需要在下拉列表中添加属性,然后需要添加属性,然后可以使用引用错误: HTML

  • 我最近一直在研究Spring集成和AMQP(RabbitMQ),因为我需要用异步方法通信两个应用程序(中间件和后端),这样中间件在接收客户端调用时就不会阻塞。 我首先采用了一种更简单的方法,以同步方式实现这一点,这意味着我在中间件上有一个网关接口和一个出站网关(requiresReply=true),然后在后端有一个入站网关和一个服务激活器。这种初始方法工作得很好(我使用了Spring集成XML配

  • } 要获取令牌,我执行以下步骤: > 使用浏览器转到:http://localhost:9000/oauth/authorize?response_type=code&client_id=test&redirect_uri=http%3a%2f%2flocalhost%3a8080%2f&scope=write 首先,它将我重定向到一个登录表单,在那里我输入用户名和密码:admin abc 请帮我

  • 我有我的应用程序在本地工作正常,但当我试图连接到远程服务器我得到这个错误:CLIENT_PLUGIN_AUTH是必需的。