2012-06-12 1 views
0

저는 Play 2.0.1 앱을 보유하고 있으며 스프링 데이터 바인더를 통해 양식 처리에 대한 응답을 얻고 있습니다 (described in the documentation). 나는, 양식을 하바의 사용자가 같은 것을 찾고, 다른 사용자에게 메시지를 보내는 가정 해 봅시다 지점에 도착 :JSR 303/Bean 유효성 검사를 통해 얼마나 많은 논리를 처리해야합니까?

public class MessageForm { 

    @NotNull @NotEmpty 
    public String message; 

    @NotNull 
    public User recipient; 

    // i know, no sender 
} 

내 사용자 정의 바인더가 확인합니다을 그 자신의 ID로 표현되는 사용자, HTML 양식은 올바르게 직렬화되며 이러한 사용자가 없을 때 기본값은 null입니다.

추가 검증을 작성하려고합니다. 사용자가 양식을 통해 전달되었는지 확인하기 위해 메시지를 게시하려는 사용자와 친구입니다. 이것은 기본적으로 일종의 @FriendsWithCurrentUser -Annotation 일 것입니다.

나는 그걸하는 법을 안다. 나의 질문은 이것이다. 이것은 좋은 생각인가? 모듈 관점에서 볼 때 웹 컨텍스트에 다소 뿌리깊은 제약이 될 수 있으므로 필자의 모델 인 패키지에 넣고 싶지는 않습니다. 나는 이것이 JSR이 의미하는 것이 아닐지 모르는 모호한 느낌을 가지고 있지만, 컨트롤러의 로직을 크게 줄이고 사용자 제출물에 비슷한 제약 조건을 재사용 할 수 있다고 생각한다.

답변

1

일반적인 문제입니다. 다른 유사한 경우는 데이터베이스와 통신해야하는 유효성 검사입니다.

내 관점에서 질문은 얼마나 자주 해당 유효성 검사를 사용할 것입니까? 그것은 20 곳에서 사용되는 무언가 있다면 주석 + 유효성 검사기 클래스를 작성하지만 하나 또는 두 곳 에서이 유효성 검사가 사용되는 경우 수동으로 ConstraintViolationException 던져하는 것이 좋습니다. 그런 다음 우리는 여전히 일반적인 검증 메커니즘을 사용하고 있지만 의심스러운 검증 클래스를 작성할 필요는 없습니다. 때로는 이것은 성능 문제이기도합니다. 우리는 검증을 위해 데이터베이스에 쿼리를 수행하고 쿼리는 종종 비즈니스 로직에서 반복됩니다.

다른 응용 프로그램 계층을 혼합하는 유효성 검사기와 나머지 코드의 유효성 검사를 잘 구분하는 것의 절충안입니다.

일반적으로 동일한 유효성 검사가 다른 곳에서 사용되어야하므로 종종 별도의 유효성 검사를 작성하는 것이 좋습니다. 별도의 유효성 검사기가 없으면 나는 종종 기존의 유효성 검사 코드를 복제합니다. 그 이유는 항상 리팩토링 검증을하는 것이 더 중요하기 때문입니다 ...

Bean 유효성 검사 아이디어는 유효성 검사를 담당하는 응용 프로그램에서 별도의 레이어를 갖는 것입니다. 주어진 모델은 다양한 방법으로 유효성을 검사 할 수 있기 때문에이 레이어를 Model과 섞어서는 안됩니다.

하나의 모델과 다양한 유효성 검사기 세트가있을 수 있습니다. 주석은 단지 구성 일뿐입니다. 때로는 Model이 다양한 제품에 사용되는 경우 주석을 포기하고 XML 기반 구성을 사용하는 것이 더 좋습니다 (이해하고 사용하기 쉽습니다).

Model 패키지에 유효성 검사기를 넣지 않으려면 유효성 검사기에 대한 새 패키지를 만들어야합니다.

관련 문제