2011-02-08 14 views
6

में उप-पथ से जुड़े होने के लिए एक बाधा उल्लंघन को कस्टमाइज़ करने का प्रयास कर रहा हूं, मैं JSR303 का उपयोग कर रहा हूं और एक क्लास-स्तरीय बाधा उत्पन्न करता हूं जो पासवर्ड और उसकी पुष्टि को किसी रूप में तुलना करता है, जो कि मैं यहां @ समान नाम की बाधा का नाम रखूंगा। आदर्श रूप में, मुझे बाधा को लक्षित लक्ष्य (पुष्टिकरण विधि) से जोड़ना पसंद होता, लेकिन स्पष्ट रूप से संलग्न बीन पासवर्ड प्रोप निकालने के लिए उपलब्ध नहीं है। - इसलिए वर्ग स्तर की बाधा।JSR303: क्लास-स्तरीय रिलेशनशिप बाधा वैधता

मैंने अन्य पदों के साथ पढ़ा है कि रिश्ते को प्रमाणित करने के लिए कक्षा-स्तर की बाधाओं का लाभ उठाने के तरीके को प्रदर्शित किया गया है, लेकिन इस मामले में बाधा उल्लंघन को कैसे अनुकूलित किया जा सकता है, इस बारे में कुछ भी नहीं समझा जा सकता है, इस मामले में रिश्ते में दो क्षेत्रों में से।

मेरा प्रश्न निम्न है: मैं संदेश को शीर्ष-स्तर ऑब्जेक्ट के बजाय 'पुष्टिकरण' फ़ील्ड के साथ बाधा उल्लंघन से कैसे जोड़ूं? मैंने javax.Validator.validate (लक्ष्य, संदर्भ) के संदर्भ पैरामीटर का उपयोग करने का प्रयास किया है, लेकिन @SameAs के लिए सत्यापनकर्ता के भीतर एक नोड जोड़ना कैस्केड में अगली बाधा के लिए अपवाद का कारण बनता है (पुष्टिकरण निकालने का प्रयास कर रहा है -> आदेश संख्या संपत्ति परिणामस्वरूप -> ऑर्डर नम्बर) परिणामस्वरूप।

इस पल के लिए मैंने वेब परत पर पुष्टिकरण इनपुट इनपुट क्षेत्र के पास उपयोग के लिए बाहर निकाले गए बाधा संदेश को संग्रहीत करने वाली अतिरिक्त संपत्ति बनाकर एक बदसूरत क्लज का उपयोग किया है।

निश्चित रूप से मैं कुछ यहाँ याद आ रही है .... कृपया कोई टिप्पणी

उदाहरण

@Constraint(validatedBy = { SamePwdAsValidator.class}) 
public interface SamePwdAs {//... 
} 

//Using passwords in an order doesn't make sense - only for demo purpose 
@SamePwdAs(message = "Password and confirmation must match" ...) 
public class Order { 

    @NotNull 
    @Size(....) 
    String pwd; 

    //where I would really like to use @SameAs, and associate a violation 
    String pwdConfirm; 

    @NotNull (...) 
    @Pattern (....) 
    String orderNumber; 

    //...getters/setters 
} 

public class SamePwdAsValidator implements javax.validation.Validator { 
//... 
    public boolean isValid(Object target, ValidationContext ctx) { 
    String tgt = target.getPwd(), other = target.getPwdConfirm() 
    boolean isValid = tgt.equals(other); 

    if (!isValid) { 
     //try to configure the context subpath for pwdConfirm to associate this constraint violation with: I tried 
     //ctx.addNode('pwdConfirm').addConstraintViolation() which doesn't work, as the next validator will 
     //bump into trying to extract Order.pwdConfirm.orderNumber and throw a NoPropertyFoundException or the like 
    } 

    return isValid; 
} 

उत्तर

5

2 जवाब देने के लिए जा रहा हूँ के लिए नीचे दिए गए

धन्यवाद उदाहरण देखें।

उत्तर 1, जो आपके सवाल का जवाब देने का प्रयास करती है: जहां दो पासवर्ड तुलना

public static final void recreateConstraintViolation(ConstraintValidatorContext constraintValidatorContext, String errorCode, String fieldName) { 
     constraintValidatorContext.disableDefaultConstraintViolation(); 
     constraintValidatorContext.buildConstraintViolationWithTemplate(errorCode). 
     addNode(fieldName).addConstraintViolation(); 

} 

और फिर, अपने सत्यापनकर्ता में: मैं बहुत की तरह एक उपयोगिता विधि का उपयोग

if (!isValid) { 
    for (String fieldName : fieldNames) { 
     CustomConstraintUtils.recreateConstraintViolation(constraintValidatorContext, "password.password2.mismatch", fieldName); 
    } 
    return false; 
} 

उत्तर 2

मेरा सुझाव है कि आप पासवर्ड मिलान की देखभाल करने के लिए स्प्रिंग सिक्योरिटी जैसे सुरक्षा ढांचे का उपयोग करें, क्योंकि मुझे लगता है कि आपका उपयोग-केस उपयोगकर्ता लॉगऑन से निपट रहा है।

संबंधित मुद्दे