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

Spring Boot数据Rest中的Bean验证不起作用

慎兴业
2023-03-14

我有一个使用SpringDataREST的非常简单的SpringBoot2.0.3项目。

当我尝试使用http:localhost:8080/users上的POST添加电子邮件地址无效的用户时,会返回以下JSON:

{
    "timestamp": "2018-08-07T18:16:15.513+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Could not commit JPA transaction; nested exception is 
    javax.persistence.RollbackException: Error while committing the 
    transaction",
    "path": "/users"
}

波姆。XML

<modelVersion>4.0.0</modelVersion>

<groupId>in.tschud</groupId>
<artifactId>User</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>User</name>
<description>RESTful User API</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

用户应用。JAVA

@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

}

使用者JAVA

@Data
@NoArgsConstructor
@Entity
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private long id;

    @Email
    private String email;

    private String firstName;

    private String lastName;

    private String password;

}

用户存储库。JAVA

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<User, 
Long> {

}

我在谷歌上搜索过,几年前似乎有很多相关的问题,我在这里尝试过建议的解决方案

但这些都不起作用。

我已经花了很多时间试图让它工作(比编写一个简单的JAX-RS APIendpoint做同样的事情要多得多),所以任何帮助都将不胜感激。

必须在下面发布控制台输出,因为这里的帖子限制为3000个字符。

共有1个答案

佟英武
2023-03-14

您发布的所有内容都表明它按预期工作。

将引发ConstraintViolationException,该消息表明该电子邮件确实无效。

可能让您困惑的是,返回的错误默认为Http状态500。您必须没有在同一个控制器中声明异常处理程序,或者没有在标记为ex的类中声明@ControlllerAdtions

@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Request content invalid")
@ExceptionHandler(javax.validation.ConstraintViolationException.class)
public void error() {
    // You can customize messages and extract faulty fields
}
 类似资料:
  • 我的springboot版本是2.3.7。我知道spring boot starter验证不是spring boot starter web的可传递依赖项。但即使单独添加了它,我的注释也不起作用。 //下面的依赖我已经添加build.gradle编译'org.springframework.boot: spring-boot-starter-validation' //我希望在请求时出错的示例类

  • 最近在一个项目中,我注意到JSR303bean验证在Springboot版本2.3.0中不起作用。从发布开始(至少,不是以同样的方式,我甚至无法找出发布文档中发生了什么变化https://spring.io/blog/2020/05/15/spring-boot-2-3-0-available-now)对于Kotlin。 问题:@NotNull、@NotBlank等bean注释被忽略并且验证不启动

  • 我正在使用Primefaces客户机bean验证,但它不起作用,错误消息消失,即使验证失败也会调用Listener。 示例-xhtml- 我正在使用-Primefaces 4 Jsf 2.2.6(mojarra)tomcat 7 请帮帮我。谢了。

  • 我有一个简单的springboot应用程序和一个Rest api。我想验证请求参数不为null/空。我将json转换成一个java对象,并从这里开始验证它们是否包含所有必需的字段,并且不为null或不为空。(对象没有保存到db)我目前正在使用javax验证方法,但是没有成功。 我还有一个包含的要素类,我需要验证(所有字段均为必填字段,而不是空或空)

  • 问题内容: 我在JSF托管bean中使用了Hibernate Validation批注。当我使用时,或者它们似乎没有以任何方式被触发。 视图: 这是怎么引起的,我该如何解决? 问题答案: 介绍 由于您未对使用的是哪个容器的问题发表评论,因此我在您的问题历史记录中进行了了解,以了解所有使用的容器。到目前为止,我只找到了Tomcat。因此,对于这个答案,我将假设您确实使用了我最初在发布评论时所猜测的T

  • 我使用Jersey 2.19来实现REST API,但是我很难让资源验证像我预期的那样工作。 我的资源是这样的。 当我发出以下cURL请求时: 我在终端窗口中得到以下响应: 也就是说,的值是,正如Java EE教程中定义的那样,不会引发异常。