2014-04-18 8 views
0

조건부 null이 아닌 제약 조건을 적용하기 위해 필드에 사용자 정의 유효성 검사기를 추가하려고합니다. 이 요구 사항은 여러 객체에서 공유되므로 기존의 전역 (객체 또는 필드가 아닌) 메시지 키를 다시 사용하고자합니다. 아래의 예에서는 objectA.fieldC.null.message이 아닌 default.null.message을 사용하려고합니다.왜 사용자 정의 필드 검사기에서 전역 메시지 키를 반환 할 수 없습니까?

documentation for the Grails validator은 message.properties에서 키를 나타내는 문자열 값을 반환하여 오류 사례를 알릴 수 있다고합니다.

이 폐쇄가 반환 할 수 있습니다 : 문서는 (강조 광산)을 나타냅니다

  • 값이 유효 함을 표시하는 경우는 null 또는 사실 (또는 반환 값) 유효하지 않은 값을 표시하기 위해 거짓
  • "classname.propertyName"에 추가 할 오류 코드를 나타내는 문자열을 사용하십시오. 오류 메시지를 해결하는 데 사용 된 문자열 필드 특정 메시지를 확인할 수없는 경우 오류 코드 자체가 해결되어 전역 오류 메시지가 허용됩니다.
  • 위와 같이 문자열을 포함하는 목록과 그 뒤에 오는 인수가 grails-app/i18n/message.properties 파일의 형식화 된 메시지 인수로 사용됩니다. 인수의 맵핑은 다음과 같습니다. 0 - 2 매개 변수는 자동으로 0 : 특성 이름, 1 : 클래스 이름, 2 : 특성 값에 맵핑됩니다. 추가 매개 변수 내가 또한 Grails bug 내가 할 노력하고 있어요 정확히 무엇을 꽤 많이 요청하는 것 1.0 다시 폐쇄 발견했습니다 매개 변수 3.

에서 시작 매핑됩니다.

다음은 내가하는 일의 예입니다. 보시다시피, 나는 한 가지 접근 방법을 가지고 있지만, 처음에는 겉으로보기에는 깨끗한 두 가지 옵션이 작동하지 않는다는 사실을 정말로 저에게 알립니다.

class ObjectA { 
    ObjectB fieldB 
    ObjectC fieldC 
    static constraints = { 
     fieldC(nullable: true, validator: { value, object, errors -> 
      if (object.fieldB != ObjectB.SOMETHING && !value) { 
       // Doesn't work 
       //return "default.null.message" 

       // Doesn't work 
       //return ["default.null.message"] 

       // This works 
       errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field \"{0}\" cannot be null") 
      } 
     }) 
    } 
} 

여기 내 message.properties의 항목입니다 : 나는 사용자 지정 오류 메시지와 Grails의 사용자 정의 필드 유효성 검사기와 관련된 여기에 couplequestions을 본 적이

default.null.message=The field "{0}" cannot be null 

,하지만 아무것도 내 특정 상황을 해결하기 위해 보인다.

+1

대답 http : // stackoverflow.com/a/19299423/2051952 – dmahapatro

+1

두 질문 모두 본질적으로 동일한 대답을 가지고 있지만, 중복으로 표시해야한다고 생각하지 않습니다. 참조한 질문에서 명령 개체를 구체적으로 호출하기 때문에 도메인 유효성 검사 질문에 대한 대답을 찾을 때 대부분의 사람들이 목록에서 선택하지 않을 것이라고 생각합니다. – jstricker

+0

도메인 클래스 및 명령 개체에 대한 제약 조건은 동일합니다. – dmahapatro

답변

0

유효성 검사 클로저의 세 가지 매개 변수 (값, 개체, 오류) 버전을 사용할 때 기본 코드는 모든 오류가 오류 개체에 추가된다고 가정합니다. 메시지 키를 나타내는 문자열 또는 문자열 목록을 반환하기 위해.

Command Objects을 사용하는 경우에도 동작이 동일합니다. 여기

는 두 개의 매개 변수의 유효성을 폐쇄의 작업 예제 :

class ObjectA { 
    ObjectB fieldB 
    ObjectC fieldC 
    static constraints = { 
     fieldC(nullable: true, validator: { value, object-> 
      if (object.fieldB != ObjectB.SOMETHING && !value) { 
       return "default.null.message" 
       // You can also use the list style return (especially if you need to pass additional parameters used by the message) 
       //return ["default.null.message"] 
      } 
     }) 
    } 
} 

그리고 여기 세 매개 변수의 유효성을 폐쇄의 작업 예입니다 중복 질문에서 이것에

class ObjectA { 
    ObjectB fieldB 
    ObjectC fieldC 
    static constraints = { 
     fieldC(nullable: true, validator: { value, object, errors -> 
      if (object.fieldB != ObjectB.SOMETHING && !value) { 
       // When "errors" is passed into the closure, you must use it to signal error cases 
       errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field \"{0}\" cannot be null") 
      } 
     }) 
    } 
}