source

javax.validation.constraint의 주석이 작동하지 않습니다.

factcode 2023. 8. 17. 21:53
반응형

javax.validation.constraint의 주석이 작동하지 않습니다.

주을사면어구필까요니합의 주석을 하려면 어떤 합니까?javax.validation.constraints맘에 들다@Size,@NotNull제 코드는 다음과 같습니다.

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Person {
      @NotNull
      private String id;

      @Size(max = 3)
      private String name;

      private int age;

      public Person(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
      }
}

다른 클래스에서 사용하려고 하면 유효성 검사가 작동하지 않습니다(즉, 개체가 오류 없이 생성됨).

Person P = new Person(null, "Richard3", 8229));

이것이 다음에 대한 제약 조건을 적용하지 않는 이유는 무엇입니까?id그리고.name제가 또 무엇을 해야 합니까?

JSR-303 bean 검증이 봄에 작동하려면 다음과 같은 몇 가지 사항이 필요합니다.

  1. 주석에: " "MVC 이름 공간 구성":<mvc:annotation-driven />
  2. JAR: JSR-303 사양 JAR:validation-api-1.0.0.GA.jar이 이미 가지고 있는 처럼) 당looks신이이미가있지고것는처럼)▁(것있(▁you럼▁like처)
  3. 예로 Hibernate : 가 일 반 적 최 절 모 유 성 검 와 구 의 현 사 양 은 같 사 효 드 장 전 대 나 으 로 사 는 타 나 용 되 예 로 는 ▁anhibernate-validator-4.1.0.Final.jar
  4. 유효성을 검사할 빈에서, 규격 JAR 또는 구현 JAR(이미 수행한)의 유효성 검사 주석
  5. 하고자 하는 핸들러에서 " 성을검핸들유검에서다추개주니가합석을체에유사할효효성을"로 주석을 달면 됩니다.@Valid그런 다음 a를 포함합니다.BindingResult메서드 서명에서 오류를 캡처합니다.

예:

@RequestMapping("handler.do")
public String myHandler(@Valid @ModelAttribute("form") SomeFormBean myForm, BindingResult result, Model model) {
    if(result.hasErrors()) {
      ...your error handling...
    } else {
      ...your non-error handling....
    }
}

클래스가 유효한지 여부를 확인하려면 Validator를 사용해야 합니다.

Person person = ....;
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Person>> violations = validator.validate(person);

그런 다음 설정된 위반을 반복하면 위반을 찾을 수 있습니다.

저의 경우 스프링 부트 버전 2.3.0을 사용하고 있었습니다.메이븐 종속성을 2.1.3을 사용하도록 변경했을 때 작동했습니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
</dependencies>

저는 몇 년 후에 이곳에 왔고, 위의 기차코멘트 덕분에 그것을 고칠 수 있었습니다.제 경우에는, 제가 실종되었습니다.@Valid주석이 달린 객체(내 경우 POJO)를 수신하는 API에서@Size그것은 문제를 해결했습니다.

다음과 같은 추가 주석을 추가할 필요가 없었습니다.@Valid또는@NotBlank 린변에로 주석이 @Size변수의 제약 조건과 API에서 언급한 내용...

Pojo 클래스:

...
@Size(min = MIN_LENGTH, max = MAX_LENGTH);
private String exampleVar;
...

API 클래스:

...
public void exampleApiCall(@RequestBody @Valid PojoObject pojoObject){
  ...
}

감사합니다.

유효성을 확인하려면 엔티티의 유효성 검사자를 호출해야 합니다.그러면 일련의 제약 조건 위반이 발생합니다.예외. 기본적으로 엔터티의 어느 필드에 제약 조건 위반이 있는지, 정확히 무엇이었는지를 표시합니다.또한 엔티티의 유효성을 검사하기 위해 예상되는 코드를 공유할 수도 있습니다.

일반적으로 사용되는 기술은 @PrePersist 트랜잭션에서 검증을 수행하고 트랜잭션 중에 여러 데이터 수정을 사용하는 경우 롤백 트랜잭션을 수행하거나 검증 예외가 발생할 때 다른 작업을 수행하는 것입니다.

코드는 다음과 같습니다.

@PrePersist
public void prePersist(SomeEntity someEntity){
    Validator validator = Validation.buildDefaultValidatorFactory.getValidator();
    Set<ConstraintViolation<SomeEntity>> = validator.validate(someEntity);
    //do stuff with them, like notify client what was the wrong field, log them, or, if empty, be happy
}

저의 경우, 그 이유는 휴지 상태-검증기 버전 때문이었습니다.최신 버전에서 더 이상 지원되지 않는 것이 있을 수 있습니다.

변경됨:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>${hibernate-validator.version}</version>
</dependency>

버전을 7.0.1에서 다운그레이드했습니다.최종 버전은 6.0.2입니다.파이널 그리고 이것이 저에게 도움이 되었습니다.

최소한 시나리오에 대해서대신 lombok 라이브러리와 함께 사용할 수도 마찬가지입니다.더 자세한 정보: https://projectlombok.org/api/lombok/NonNull.html

버전 2.3.0 이후 "spring-boot-starter-test"(NotNull/NotBlank/etc 포함)는 이제 "sprnig boot-starter-validation"입니다.

...-test에서 ...validation으로 변경하기만 하면 작동합니다.

사용 중인 버전을 2.1.3으로 다운그레이드하지 않으면 문제가 해결됩니다.

유효성 검사 제약 조건이 포함된 개체였던 @Valid를 각 멤버 변수 추가해야 합니다.

저도 같은 문제에 직면했습니다.Javax 주석(@NotNull, @Valid)이 유효성 검사를 수행하지 않았습니다.그들의 존재는 아무런 차이가 없었습니다.

javax 유효성 검사를 효과적으로 수행하려면 'springboot-starter-validation' 종속성을 사용해야 합니다.다음은 관련 종속성 구성입니다.또한 검증할 개체에 @Valid 주석을 추가하는 것도 잊지 마십시오.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
.....
.....
<dependencies>
    <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>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
 <dependencies>

제 경우에는 호출되지 않는 사용자 지정 클래스 수준 제약 조건이 있었습니다.

@CustomValidation // not called
public class MyClass {
    @Lob
    @Column(nullable = false)
    private String name;
}

사용자 지정 또는 표준 필드 수준 제약 조건을 클래스에 추가하자마자 클래스 수준 제약 조건이 작동하기 시작했습니다.

@CustomValidation // now it works. super.
public class MyClass {
    @Lob
    @Column(nullable = false)
    @NotBlank // adding this made @CustomValidation start working
    private String name;
}

나에게는 벌레 같은 행동처럼 보이지만 주변에서 일할 수 있을 만큼 충분히 쉽다고 생각합니다.

최근에 저도 같은 상황에 직면했습니다.업그레이드했습니다.hibernate-validator7.x를 초과했지만 나중에 이 릴리스 노트가 발견되었습니다.

Hibernate Validator 7.0은 Jakarta Bean Validation 3.0의 참조 구현입니다.
주요 변경 사항은 javax.package를 사용하는 모든 종속성이 현재 자카르타를 사용하고 있다는 것입니다.꾸러미
자카르타 EE 9로 이동하는 경우에만 Hibernate Validator 7로 업그레이드하는 것이 좋습니다.

8을 로 해야 에 keeping 내프을젝 8자로해때, 에속계.javax.validation로전하대신는으로 전환하는 jakarta.validation로 다운그레이드해야 했습니다.

<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.2.Final</version>
</dependency>

기본적으로 봄의 javax 유효성 검사는 Rest 컨트롤러 메서드 입력 변수에 대해 작동합니다.그러나 다른 플레이스에서 동일하게 사용하려면 @Valid 클래스 수준 주석을 사용하여 @Valid 클래스 주석을 포함하는 클래스에 주석을 달아야 합니다.

저는 카프카 청취자와 같은 문제에 직면했고, 그 후 @Validated로 주석을 달았습니다.

@Component
@Log4j2
@Validated
public class KafkaMessageListeners {

    @KafkaListener(topics = "message_reprocessor", errorHandler = "validationErrorHandler")
    public void processMessage(@Payload @Valid CustomPojo payload,
                               @Header(KafkaHeaders.OFFSET) List<Long> offsets, Acknowledgment acknowledgment) {

    }

}

메이븐을 사용하는 경우 다음을 태그 아래에 있는 pom.xml에 추가하면 됩니다.

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

Gradle의 경우 다음을 수행할 수 있습니다.

dependencies {
  ...
  implementation 'org.springframework.boot:spring-boot-starter-validation'
}

따라서 @Validat 서비스 인터페이스는 해당 개체에만 사용할 수 있습니다.ServiceRequest 개체의 계층 내에 유효성 검사가 더 있으면 명시적으로 유효성 검사를 트리거했을 수 있습니다.제가 이렇게 해왔습니다.

public class ServiceRequestValidator {

      private static Validator validator;

      @PostConstruct
      public void init(){
         validator = Validation.buildDefaultValidatorFactory().getValidator();
      }

      public static <T> void validate(T t){
        Set<ConstraintViolation<T>> errors = validator.validate(t);
        if(CollectionUtils.isNotEmpty(errors)){
          throw new ConstraintViolationException(errors);
        }
     }

}

개체에 대한 유효성 검사를 트리거하려면 개체 수준에 다음 주석이 있어야 합니다.

@Valid
@NotNull

로 Objects할 수 Objects.requireNull()은 다음과 .test(String str) { Objects.requireNonNull(str); }그러나 이것은 런타임에만 확인되며 null인 경우 NPE를 던집니다.이것은 전제 조건 검사와 같습니다.하지만 그것이 당신이 찾고 있는 것일 수도 있습니다.

열차의 좋은 답변이지만 예외를 포착하는 더 나은 솔루션은 자체 HandlerExceptionResolver 및 catch를 활용하는 것입니다.

@Override
public ModelAndView resolveException(
    HttpServletRequest aReq, 
    HttpServletResponse aRes,
    Object aHandler, 
    Exception anExc
){
    // ....
    if(anExc instanceof MethodArgumentNotValidException) // do your handle     error here
}

그러면 핸들러를 최대한 깨끗하게 유지할 수 있습니다.더 이상 제 핸들러 메소드에 바인딩 결과, 모델 및 일부 폼빈이 필요하지 않습니다.

저는 최근에 매우 비슷한 상황에서 이 문제를 접했습니다.나열된 최고 등급의 답변으로 모든 요구 사항을 충족했지만 여전히 잘못된 결과를 얻었습니다.

그래서 저는 저의 의존성을 살펴보았고 제가 그 중 일부를 놓치고 있다는 것을 발견했습니다.누락된 종속성을 추가하여 수정했습니다.

최대 절전 모드를 사용하고 있었는데 필요한 종속성은 다음과 같습니다.

*초보자를 위한 봄과 겨울잠 수업에서 찍은 스냅샷 @ Udemy.

lombok을 사용하는 경우 @NonNull 주석을 대신 사용할 수 있습니다.또는 pom.xml 파일에 javax.validation 종속성을 추가합니다.

최대 절전 모드 유효성 종속성을 통해 서버 측 유효성 검사를 수행할 수 없는 사용자용입니다.Hibernate Validator +javax 유효성 종속성을 제거하고 spring-boot-starter 유효성을 추가하기만 하면 됩니다.내부적으로 Hibernate Validator를 제공하며, 저에게는 잘 작동했습니다.

크레딧:- 유튜브 댓글.

저도 같은 문제에 빠졌지만 해결책이 생겼습니다.

servlet 구성 xml 파일(예: {servlet-name}-servlet.xml 파일)

와 같아야 합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
       <context:component-scan base-package = "spring.tutorial.controller" />
       
->>>  Step 4: Add support for conversion, formatting and validation support
       
        <mvc:annotation-driven/>        
    
       <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name = "prefix" value = "/WEB-INF/views/" />
          <property name = "suffix" value = ".jsp" />
       </bean>
    
    </beans>

4단계는 중요한 단계입니다.

제 경우에는 이 선들을 제거했습니다.

1-가져오기 javax.configuration.constraints.constraints.Null이 아님;

2-import javax.configuration.constraints.constraints.크기;

3 - @Null 아님

4 - @ 크기(최대 = 3)

언급URL : https://stackoverflow.com/questions/8756768/annotations-from-javax-validation-constraints-not-working

반응형