首页 > 解决方案 > 为什么休眠验证不起作用?

问题描述

我已经向我的 DTO 添加了休眠验证注释,并且在控制器中我添加了 @Valid 注释,但是当我使用邮递员而不是由于输入无效而引发错误时,它会将数据存储在数据库中。

这是我的 Dto 课程:

@Getter
@Setter
@NoArgsConstructor
public class CategoryDto {

    @Email
    private String name;
    @NotNull(message = "Cannot be null")
    private String imageUrl;
    private String message;

    public CategoryDto(Category category, String message) {
        this.name = category.getName();
        this.imageUrl = category.getImageUrl();
        this.message = message;
    }
}

这是我的控制器类:

    @PostMapping(value = "/add")
    public ResponseEntity<Category> addCategory(@Valid @RequestBody CategoryDto categoryDto) throws CategoryAlreadyExistsException {
        Category categoryDetail = categoryService.addCategory(new Category(categoryDto));
        return new ResponseEntity<>(categoryDetail, HttpStatus.CREATED);
    }

这是服务类:

    @Override
    public Category addCategory(Category category) throws CategoryAlreadyExistsException {
        if (categoryRepository.findById(category.getName()).isPresent()) {
            throw new CategoryAlreadyExistsException(ExceptionMessage.CATEGORYALREADYEXISTS);
        }
        return categoryRepository.save(category);
    }

这是我的 build.gradle 文件:

plugins {
    id 'org.springframework.boot' version '2.5.0-SNAPSHOT'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'org.sonarqube' version '3.0'
    id 'jacoco'
}

group = 'com.project'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '15'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
    maven { url 'https://repo.spring.io/snapshot' }
}

dependencies {
    implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.5.5'
    implementation group: 'org.hibernate.validator', name: 'hibernate-validator', version: '7.0.1.Final'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//  implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
//  implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

sonarqube {
    properties {
        property 'sonar.host.url', 'http://localhost:9000'
        property 'sonar.login' , 'admin'
        property 'sonar.password', 'J*j*ts*'
    }
}

//jar {
//  manifest {
//      attributes "Main-Class": "GeckoApplication"
//  }
//}

jacocoTestReport {
    reports {
        xml.enabled true
    }
}

我不知道为什么 spring boot 会这样。它实际上应该抛出一个 MethodArgumentNotValidException 但它甚至不验证输入,它直接将数据存储在数据库中。这是我的 Json 请求:

{
    "name": "asdkald",
    "imageurl": ""
}
{
    "name": "asdkald"
}

我尝试了不同的方法,但它不起作用。这是我试图点击“localhost:8090/gecko/category/add”的网址。我用邮递员打到了休息的终点。

标签: spring-boothibernatespring-data-jpa

解决方案


这是由于休眠验证器的版本。我将版本从 7.0.1.Final 更改为 6.1.5.Final 并且一切都开始工作


推荐阅读