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

Kotlin JSR303 Bean验证在Springboot版本2.3.0中不起作用。继续发布

巩俊远
2023-03-14

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

问题:@NotNull、@NotBlank等bean注释被忽略并且验证不启动。

有人注意到类似的事情吗?或者知道发生了什么变化,以及如何使bean验证在Springboot2.3.0中工作。发布开始?

这是我的设置-

工作设置

data class HelloDto(

@field:NotBlank(message = "greeting is required")
val greeting: String,

@field:NotBlank(message = "count is Required")
val count: String
)

@RestController
@RequestMapping("/api")
class MyController {

    @PostMapping("/hello")
    fun helloKotlin(@RequestBody @Valid helloDto: HelloDto): String {
        return "hello world "+ helloDto.greeting
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>11</java.version>
        <kotlin.version>1.5.31</kotlin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.13.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
            <version>2.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.2</version>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <configuration>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                    </compilerPlugins>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <!-- RELEASE_VERSION -->
                <version>5.1.0</version>
                <!-- /RELEASE_VERSION -->
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/src/main/resources/bank-api.yaml</inputSpec>
                            <generatorName>java</generatorName>
                            <configOptions>
                                <sourceFolder>src/gen/java/main</sourceFolder>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

请求:

{
  "name":"",
  "count":""
}

回应:

{
    "timestamp": "2021-12-23T16:18:03.177+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "NotBlank.user.name",
                "NotBlank.name",
                "NotBlank.java.lang.String",
                "NotBlank"
            ],
            "arguments": [
                {
                    "codes": [
                        "user.name",
                        "name"
                    ],
                    "arguments": null,
                    "defaultMessage": "name",
                    "code": "name"
                }
            ],
            "defaultMessage": "must not be blank",
            "objectName": "user",
            "field": "name",
            "rejectedValue": "",
            "bindingFailure": false,
            "code": "NotBlank"
        }
    ],
    "message": "Validation failed for object='user'. Error count: 1",
    "path": "/users"
}

非工作设置-只要我将springboot更新到2.3.0。RELEASE已忽略验证。

我发布这个问题有两个原因-

  1. 去寻求一些帮助,找出发生了什么变化。
  2. 为了帮助别人不要因为版本问题浪费那么多时间(我花了一天的时间才找到这个)

TIA!

共有1个答案

阎建中
2023-03-14

发布这个答案以防其他人面临这个问题。

问题是

web启动器中不再包含验证启动器

因此,我们必须手动添加验证依赖项。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#spring-boot-23-发行说明

 类似资料:
  • 我的springboot版本是2.3.7。我知道spring boot starter验证不是spring boot starter web的可传递依赖项。但即使单独添加了它,我的注释也不起作用。 //下面的依赖我已经添加build.gradle编译'org.springframework.boot: spring-boot-starter-validation' //我希望在请求时出错的示例类

  • 我使用的firebase手机身份验证不起作用,它在调试模式下起作用,但当我在playstore的发布版本中发布它时,它显示错误 变体失败com.google.firebase.authFirebase AuthExcure:此应用无权使用Firebase身份验证。请确认Firebase控制台中配置了正确的软件包名称和SHA-1。[应用验证失败] 这是错误信息的截图

  • 我正在android应用程序中使用Firebase SDK进行手机身份验证OTP验证。这在调试版本上运行良好,但在发布版本上不起作用。 在Firebase项目中添加了我的调试SHA-1指纹。 在Firebase项目中添加了我的发布认证SHA-1指纹。 我还没有发布/发布构建到google play store。 提前谢谢

  • OTP验证在调试构建中正常工作。我还在firebase控制台中为发行版添加了SHA键。但是当我生成签名的apk并将其上传到播放商店时,电话身份验证就不起作用了。我应该保留调试SHA密钥和释放密钥后,我上传的应用程序到生产的play Store?在生产过程中使用firebase应用程序时,谷歌应用程序签名是强制的吗?

  • 我需要在我的Spring API中验证一些json输入和输出,我试图使用Spring boot starter验证(已经知道这不在spring-boot-starter-web中,所以我手动添加了它),但是当基于DTO类中的验证出现错误时,它从不抛出异常(MethodArgumentNotValidException) 完整的项目可以在github上fonud 我所尝试的: > 我尝试添加以下3个

  • 我已经创建了一个react原生应用程序,我必须添加我已经完成的推送通知,对于推送通知,我使用了react原生onesignal软件包。但通知存在一些问题,在我的应用程序中,当我发送通知时,应用程序会收到通知,但当我尝试打开通知时,应用程序会卡住(挂在当前屏幕上),我还为单信号通知添加了Onpress事件侦听器。notifications onpressed事件侦听器在我的应用程序中工作不正常。有了