2013-05-21 3 views
0

최대 절전 모드 유효성 검사기 유효성 검사 메시지의 메시지 값으로 {this}를 넣고 싶습니다. \ {이 \} 최대 절전 유효성 검사기 메시지에서 중괄호를 이스케이프하는 방법 (테스트 사례 제공)

그러나 Hibrnate 검사기는 지정된 키에 대한 메시지가 있는지 확인하는 시도를 :

그래서 내가 파일 속성이 주어진 메시지의 가치를 탈출했다. 이것이 버그라고 생각하지만 어쩌면 내가 잘못하고있는 것일까 요? (최대 절전 모드 - 유효성 검사기 4.3.1와 5.0.1 테스트 - 동일한 결과 - 스택 오버 플로우

테스트 케이스 :

(이 등록 정보 파일이 없습니다 단순화를 위해, 난 그냥 자바 클래스의 값을 반환 현실. 는 handleGetObject가) 내 사용자가 제공하는 속성의 값을 읽을 것입니다 :

import org.hibernate.validator.HibernateValidator; 
import org.hibernate.validator.HibernateValidatorConfiguration; 
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl; 
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; 
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator; 
import org.junit.Test; 

import javax.validation.*; 
import javax.validation.constraints.Max; 
import java.util.Enumeration; 
import java.util.Locale; 
import java.util.ResourceBundle; 
import java.util.Set; 


public class HibValTest { 

@Test 
public void shouldNotSubstituteEscaped() throws Exception { 

    MessageInterpolator interpolator = new ResourceBundleMessageInterpolator(new ResourceBundleLocator() { 

     @Override 
     public ResourceBundle getResourceBundle(Locale locale) { 
      return new ResourceBundle() { 

       @Override 
       protected Object handleGetObject(String key) { 
        return "\\{escapedKey\\}"; 
       } 

       @Override 
       public Enumeration<String> getKeys() { 
        throw new UnsupportedOperationException(); 
       } 
      }; 
     } 
    }, false); 

    HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure(); 
    config = config.messageInterpolator(interpolator).constraintValidatorFactory(new ConstraintValidatorFactoryImpl()); 

    ValidatorFactory factory = config.buildValidatorFactory(); 
    Validator validator = factory.getValidator(); 

    Set<ConstraintViolation<A>> validate = validator.validate(new A()); 
} 

private class A { 
    @Max(value=1, message = "{key}") 
    private int a=2; 
} 
} 

결과 :.

이 실제로 벌레처럼 보이는
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244) 
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211) 

답변

0

당신이 티켓을 만들 수 있습니다 우리 issue tracker에 제발, 제발?

당분간 이스케이프 된 키 값을 입력하지 않아도됩니다 (예 : 가능한 경우). 같은 :

protected Object handleGetObject(String key) { 
    return key.equals("key") ? "\\{escapedKey\\}" : null; 
} 
+0

는 해결 제안에 관해서는 https://hibernate.atlassian.net/browse/HV-798 –

+0

제출 -이되어 현재 우리가 ??? '키를 반환으로 우리하지 편리 ??? ' 누락 된 키가 속성에 누락 된 부분이 있는지 확인합니다. –