source

스프링 부트 검증 주석 @Valid 및 @NotBlank가 작동하지 않음

manysource 2023. 2. 22. 22:37

스프링 부트 검증 주석 @Valid 및 @NotBlank가 작동하지 않음

getPDFDetails 메서드를 호출하는 메인컨트롤러를 다음에 나타냅니다.

@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
    public ResponseEntity<?> printContracts(@RequestBody final UpdatePrintContracts updatePrintContracts) throws Exception {
    
        System.out.println("contracts value is "+ updatePrintContracts);
        
        Integer cancellationReasons = service.getPDFDetails(updatePrintContracts);
        
        System.out.println("success!");
        
        return ResponseEntity.ok(cancellationReasons);
    }   

다음은 검증 주석 및 대응하는 getter/setter 메서드를 사용하여 모든 변수를 정의한 UpdatePrintContracts 클래스입니다.

public class UpdatePrintContracts {
    
    @Valid
    @NotBlank
    @Pattern(regexp = "\\p{Alnum}{1,30}")
    String isReprint;
    
    @Valid
    @NotBlank
    Integer dealerId;
    
    @Valid
    @NotBlank
    @Pattern(regexp = "\\p{Alnum}{1,30}")
    String includeSignatureCoordinates;
    
    @Valid
    @NotBlank
    java.util.List<Integer> contractNumbers;

    public String getIsReprint() {
        return isReprint;
    }

    public void setIsReprint(String isReprint) {
        this.isReprint = isReprint;
    }

    public Integer getDealerId() {
        return dealerId;
    }

    public void setDealerId(Integer dealerId) {
        this.dealerId = dealerId;
    }

    public String getIncludeSignatureCoordinates() {
        return includeSignatureCoordinates;
    }

    public void setIncludeSignatureCoordinates(String includeSignatureCoordinates) {
        this.includeSignatureCoordinates = includeSignatureCoordinates;
    }

    public java.util.List<Integer> getContractNumbers() {
        return contractNumbers;
    }

    public void setContractNumbers(java.util.List<Integer> contractNumbers) {
        this.contractNumbers = contractNumbers;
    }
    
}

프로젝트(다른 이름으로 실행)를 마우스 오른쪽 버튼으로 클릭하고 변수 isReprintincludeSignatureCoordinates의 빈 값을 Soap UI를 통해 전달하여 응용 프로그램을 Spring Boot 앱으로 실행하려고 합니다.그러나 유효성 검사가 작동하지 않으며 Soap UI에서 유효성 검사 오류를 발생시키지 않습니다.제가 무엇을 빠뜨리고 있나요?어떤 도움이라도 감사합니다!

최신 버전의 스프링부트(2.3.0)에서 이 문제가 발생했을 경우는, 다음의 의존 관계를 추가해 주세요.

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

관찰:Spring Boot의 이전 버전(1.4.7)에서는javax.validation바로바로 작업하곤 했죠그러나 최신 버전으로 업그레이드한 후 주석이 끊어졌습니다.다음 종속성을 추가하는 것만으로는 작동하지 않습니다.

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

이는 JSR 사양은 제공되지만 구현은 제공되지 않기 때문입니다.를 사용할 수도 있습니다.hibernate-validator대신spring-boot-starter-validation.

2.0.1에서 이 문제가 발생하는 모든 사용자에게 적합합니다.최종:

2.2 이상의 모든 SpringBoot 버전에서 Validations Starter는 이상 Web Starter의 일부가 아닙니다.

여기서 참고 사항 확인

따라서 이 의존관계를 build.gradle/pom 파일에 추가하기만 하면 됩니다.

그래들:

implementation 'org.springframework.boot:spring-boot-starter-validation'

메이브

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

먼저 UpdatePrintContracts에서 이러한 클래스 변수에 대해 @Valid 주석을 사용할 필요가 없습니다.삭제할 수 있습니다.

@Controller 입력 검증을 트리거하려면 입력 인수에 @Valid 또는 @Validated로 주석을 붙입니다.

@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
public ResponseEntity<?> printContracts(@Valid @RequestBody  final UpdatePrintContracts updatePrintContracts) throws Exception {

스프링 부트에서의 모델 검증에 대한 자세한 내용은 여기를 참조하십시오.

또한 문자열에 특정 문자만 포함되어 있는지 확인하려면 패턴이 모든 문자열과 일치하는지 확인하기 위해 앵커(문자열의 시작은 ^, 끝은 $)를 추가해야 합니다.괄호는 수량을 기입하기 위한 것입니다.

@Pattern(regexp = "^[\\p{Alnum}]{1,32}$")

마지막으로, 네 반에 다음 항아리가 있을 거야

.validation-api.jar (추상 API와 주석 스캐너 포함)

.syscate-validator.jar (구체적인 실장)

나도 같은 실수를 했다.

아래 두 개의 종속성을 단독으로 사용해야 했습니다.

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

리고 and and를 사용하세요.@Validatedimport org.springframework.validation.인터레이션).Validated)및 "Rest " (REST 완료)@Validmethod " " " " " " ( "ax. validation " " " ) 。 ( )

javax.validation.validation-api,org.hibernate.hibernate-validator아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다. 이러한 를 pom.

스프링 부트에서 이 검증 의존성을 사용했는데 작동하지 않았습니다.

<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>

spring-boot-starter-validation으로 대체했더니 효과가 있었습니다.

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot- 
starter-validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.0</version>

이것은, 상기의 순서에 따라서도 같은 문제가 발생하고 있는 분들을 대상으로 하고 있습니다.변경을 유효하게 하려면 , IDE(IntelliJ)를 재기동할 필요가 있었습니다.

이것으로 나의 문제는 해결되었다. 내 ,@Valid이 경우 모두 주석을 달아야 합니다.자세한 내용은 링크

스텝 1: pom.xml 파일에 이들2개의 의존관계를 추가합니다.

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>

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

스텝 2: 다음과 같은 커스텀 예외 클래스 만들기

package com.bjit.salon.auth.service.exceptions;


import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.stream.Collectors;

@ControllerAdvice
public class AnynameApplicationException {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseEntity<List<String>> processUnmergeException(final 
MethodArgumentNotValidException ex) {

        List<String> list = ex.getBindingResult().getAllErrors().stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());

        return new ResponseEntity<>(list, HttpStatus.BAD_REQUEST);
    }
}

스텝 3: 다음과 같이 메서드 인수에 @Valid 주석을 추가합니다.

public ResponseEntity<?> registerAccount(@Valid @RequestBody UserRegisterDto 
      registerDto) {
       
    // rest of the codes
}

반드시 @RequestBody 앞에 @Valid 주석을 사용하십시오.

이 ""에서 합니다.jakarta.validation.*, 'package' (패키지)javax.validation.* 같기 주석의 이름이 둘 다 같기 때문에.

이 의존관계를 pom.xml에 추가해야 합니다.

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

주의: 일반적으로 스냅샷, M1, M2, M3, M4 릴리즈는 진행 중입니다.스프링 팀이 아직 작업 중이므로 사용하지 않는 것이 좋습니다.

@NotEmpty를 사용하면 빈 값과 늘 값을 모두 확인할 수 있습니다.RestController 클래스의 메서드에 @Valid 추가

언급URL : https://stackoverflow.com/questions/48614773/spring-boot-validation-annotations-valid-and-notblank-not-working