2014-06-30 1 views
2

원할 때 표준 검증 유효성 검사를 무시할 수 있는지 여부를 알고 싶습니다. 예를 들어, 그때, 그냥 명확하게하기 위해다른보기에서 재생 프레임 워크 양식 오류 무시

@Entity 
public class Car{ 

    @Id 
    private Long id; 

    @Required 
    private String model; 

    @Required 
    private String hiddenField; //important but doesn't appear in some cases (some usecases) 

} 

같은 엔터티라는 자동차를 가정 해 봅시다

사례 1

@(carForm : Form[Car]) 
@import helper._ 

@form(routes.controller.foo.bar) { 
    @inputText(carForm("model")) 
    <input type="submit"> 
} 

사례 2

@(carForm : Form[Car]) 
@import helper._ 

@form(routes.controller.foo.bar) { 
    @inputText(carForm("model")) 
    @inputText(carForm("hiddenField")) 
    <input type="submit"> 
} 

그런 다음 Play.data.Form 개체가 있고 모델 또는 e로 주어진 hiddenField를 채우지 않았기 때문에 오류가 발생합니다. xmple. 그러나 실제로,이 숨겨진 된 경우조차 보이지 않는 경우가 있습니다 (사례 1), 사용자가 그 시간을 편집 할 수 없으므로 입력이 없습니다. 그래서, 두 개의 유스 케이스가 있다면, 처음에는 모든 입력이 있고 그것들은 채워져 있어야하지만, 다른 하나는 'hiddenField'입력이 없지만, 내 모델에서는 여전히 필요합니다. 물론, 그것없이 제출 된 양식도 오류가 있습니다. 어떻게해야합니까?. 어떻게 처리해야 했습니까? 하나의 모델을 가지고 있지만 유효성 검사는 다른 경우에 따라 다를 수 있으며 jquery 또는 순수한 javascript가 아닌 서버 측이어야합니다.

나는, 그런

MyForm<Car> myCarForm = Form.form(Car.class).bindFromRequest(); 
//it has errors, sure it does, hiddenField was required and that field didn't even exist at screen. 
myCarForm.discardErrors(); //ok, error hashmap is empty right now 
myCarForm.get(); // anyway, no value here. 
//myCarForm.data(); //for sure i could retrieve field by field and remount object that way, but that looks hacky and hardworking 

모든 솔루션을 (이 경우 1에서 제출 된 상상) 통해 discardErrors를 시도? 모두에게 감사합니다

답변

2

Java 용 Play 북을 읽었습니다.

6.4.2 부분 확인

일반적인 사용 사례는 동일한 개체 모델에 대한 여러 검증 제약을 가지고있다. 객체 모델에 대한 제약 조건을 정의하기 때문에 동일한 객체 모델을 참조하는 여러 형식을 갖는 것이 정상입니다. 그러나 이러한 양식에는 다른 유효성 확인 제한이있을 수 있습니다. 이 사용 사례를 설명하기 위해, 우리는 두 단계로 사용자가 새 제품을 입력 에서 간단한 마법사를 상상할 수 :

  • 한 사용자는 제품 이름을 입력하고 양식을 제출합니다.
  • 2 사용자가 제품 EAN 번호와 설명을 입력합니다.

2 단계에서 제품 이름의 유효성을 검사 할 수 있지만 제품 이름에 대한 라는 오류 메시지가 이상하게 표시됩니다. 다행히 Play에서는 부분 검증을 수행 할 수 있습니다. 주석이 첨부 된 각 값에 대해 우리는 어느 단계에서 이 적용되는지를 표시해야합니다. 우리는 주석의 그룹 속성을 사용하여이를 수행 할 수 있습니다. 의 그렇게 우리의 제품 모델 클래스를 변경하자

public Product extends Model { 
public interface Step1{} 
public interface Step2{} 
@Required(groups = Step1.class) 
public String name; 
@Required(groups = Step2.class) 
public String ean; 
} 

을 그리고, 감사

// We re//strict the validation to the Step1 "group" 
Form<Product> productForm = 
form(Product.class, Product.Step1.class).bindFromRequest(); 

컨트롤러

에!

1

예이 문제에 대한 해결책을 얻을 수 있습니다. 이 경우에 무슨 일이 일어나는지는 모델 자동차에 요청을 매핑 할 때마다 항상 모든 속성에 대해 JPA 유효성 검사를 찾은 다음 해당 모델 내부에 validate() 메서드가 있는지 확인합니다. 해당 메서드가 null을 반환하면 아무 것도 전달하지 않습니다 오류가 발생하여 정상적인 실행을 수행하지만 어떤 것이 반환되면 오류를 형성합니다. 특정 필드에 오류 매핑을 반환하거나 전역 오류로 간주되는 문자열 만 반환 할 수 있습니다. 귀하의 경우 솔루션에

은 다음과 같습니다

@Entity 
public class Car{ 

    @Id 
    private Long id; 

    private String model; 

    private String hiddenField; //important but doesn't appear in some cases (some usecases) 

    public List<ValidationError> validate() { 
    List<ValidationError> errors = new ArrayList<ValidationError>(); 
      . 
      . 
      . 
      #Some logic to validate fields# 
      #if field invalid# 
       errors.add(new ValidationError("model", "errorMessage")); 
      . 
      . 
      . 

      return errors.isEmpty() ? null : errors; 
} 

참고 : 그냥 JPA 검증을 제거하고 상황에 따라 확인하는 유효성 검사 기능에 논리를 사용합니다.

+0

감사합니다. 그런데 어떻게 검증 플레이가 사용할 것인지 선택할 수 있습니까? 나는 유즈 케이스와 다른 유스 케이스를 원하지만 그 방법은 항상 호출됩니다. – user7197