2017-12-20 13 views
0

Hibernate Validator API을 사용하여 내 개체의 필드를 확인합니다. 보이는 방법의 예는 다음과 같습니다.JSR 303에서 제약 조건 위반시 예외가 발생합니다.

@NotNull @Size(min = 3, max = 8) String name; 
@NotNull @Size(min = 3, max = 16) String surname; 
@Size(min = 3, max = 10) String company; 
// ... 

이제이 문제는 내 개체를 만들 수 있으며 예외가 발생하지 않는다는 것입니다. 예를 들어.

Person p = new Person("a", "b", "c"); 

이는 런타임 예외를 발생시키지 않고 대신 위반 된 제약 조건이있는 개체를 만듭니다. 위반 된 제약 조건을 얻으려면 Validator 인스턴스를 클라이언트 코드에서 명시 적으로 호출해야합니다. 왜 그런 식으로 만들었는지 완전히 확신 할 수는 없지만, 오브젝트의 필드가 침해 당하면 어떤 예외로 실패하는 오브젝트의 생성이 필요합니다. 그런 식으로 뭔가 :

Person p = new Person("a", "b", "c"); 

... 예외를 throw합니다. 그리고 잘못된 개체를 만들 수 없습니다. 이것이 내가 원하는 행동입니다.

달성 할 수 있습니까?

답변

0

개체를 만들 때 ctor의 값을 확인하지 않는 이유는 무엇입니까?

public Person(String name, String surname, String company) { 
    if(name == null || name.length() < 3) { 
     throw new IllegalArgumentException("useful message") 
    } 
} 

그러나 이러한 주석은 개체를 DB에 저장할 때만 작동한다고 가정합니다.

+0

당신은 내 요구 사항을 설명하려고하는 단지 기본적인 예입니다. 실제 개체는 30 개의 필드를 가지고 있으며 빌더 패턴 등을 사용하므로 사용자가 제안하는 것과 같은 것이 불가능합니다. 내가 말했듯이, 나는 제약 조건을 위반하면 실패 건설이 필요합니다 – wesleyy

0

Hibernate Validator는 당신의 생성자를 마술처럼 가로 채서 유효성 검사를 실행할 수 없습니다.

그래서해야 할 일이 있습니다.

ByteBuddy 또는 이와 유사한 클래스를 사용하여 원하는대로 구현할 수 있지만 권장할만한 것은 아닙니다.

가장 쉬운 방법은 개체를 인스턴스화 한 다음 해당 서비스에서 유효성 검사를 실행하는 비슷한 서비스 또는 서비스를 만드는 것입니다.

+0

개체를 인스턴스화하고 서비스 (또는 sth 유사) 내에서 유효성 검사 문제는 내 개체가 작성기와 함께 만들어집니다. 유일한 방법은 바로 보이지 않는 빌드 메서드 내에서 유효성 검사를하는 것입니다. 또한 구현하기가 까다 롭지 만 (가능할 수도 있음) AutoValue.Builder를 사용하고있을 때 – wesleyy

+0

ByteBuddy를 사용하여 클래스를 계측 할 수 있습니다. 그러나 그것이 더 쉬울 것이라는 점을 확신하지 못한다. –