खोज…


परिचय

स्प्रिंग में JSR303 बीन वेलिडेशन सपोर्ट है। हम इसका उपयोग इनपुट बीन सत्यापन करने के लिए कर सकते हैं। JSR303 का उपयोग करके व्यावसायिक तर्क से मान्यता सत्यापन तर्क।

JSR303 स्प्रिंग्स उदाहरणों में आधारित सत्यापन

किसी भी JSR 303 कार्यान्वयन को अपने वर्गपथ में जोड़ें। लोकप्रिय एक हाइबरनेट से हाइबरनेट सत्यापनकर्ता है।

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.2.0.Final</version>
</dependency>

कहते हैं कि सिस्टम में उपयोगकर्ता बनाने के लिए एक बाकी एपी है

@RequestMapping(value="/registeruser", method=RequestMethod.POST)
public String registerUser(User user);

इनपुट json नमूना नीचे की तरह दिखेगा

{"username" : "[email protected]", "password" : "password1", "password2":"password1"}

User.java

public class User {

    private String username;
    private String password;
    private String password2;

    getXXX and setXXX

}

हम नीचे के रूप में उपयोगकर्ता वर्ग पर JSR 303 सत्यापन को परिभाषित कर सकते हैं।

public class User {

    @NotEmpty
    @Size(min=5)
    @Email
    private String username;
    
    @NotEmpty
    private String password;
    
    @NotEmpty
    private String password2;

}

हमें एक व्यापार सत्यापनकर्ता की आवश्यकता भी हो सकती है जैसे पासवर्ड और पासवर्ड 2 (पुष्टि पासवर्ड) समान हैं, इसके लिए हम नीचे एक कस्टम सत्यापनकर्ता जोड़ सकते हैं। डेटा फ़ील्ड एनोटेट करने के लिए एक कस्टम एनोटेशन लिखें।

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface GoodPassword {
    String message() default "Passwords wont match.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

सत्यापन तर्क लागू करने के लिए एक मान्य वर्ग लिखें।

public class PastValidator implements ConstraintValidator<GoodPassword, User> {
    @Override
    public void initialize(GoodPassword annotation) {}
    
    @Override
    public boolean isValid(User user, ConstraintValidatorContext context) {
        return user.getPassword().equals(user.getPassword2());
    }
}

उपयोगकर्ता वर्ग में इस मान्यता को जोड़ना

@GoodPassword
public class User {

    @NotEmpty
    @Size(min=5)
    @Email
    private String username;
    
    @NotEmpty
    private String password;
    
    @NotEmpty
    private String password2;
}

@ अमान्य ट्रिगर वसंत में सत्यापन। BindingResult वसंत द्वारा इंजेक्ट की गई वस्तु है जिसमें सत्यापन के बाद त्रुटियों की सूची है।

public String registerUser(@Valid User user, BindingResult result);

JSR 303 एनोटेशन में उन पर संदेश विशेषताएँ हैं जिनका उपयोग कस्टम संदेश प्रदान करने के लिए किया जा सकता है।

@GoodPassword
public class User {

    @NotEmpty(message="Username Cant be empty")
    @Size(min=5, message="Username cant be les than 5 chars")
    @Email(message="Should be in email format")
    private String username;
    
    @NotEmpty(message="Password cant be empty")
    private String password;
    
    @NotEmpty(message="Password2 cant be empty")
    private String password2;

}

स्प्रिंग जेएसआर 303 सत्यापन - त्रुटि संदेशों को अनुकूलित करें

मान लीजिए कि हमारे पास सत्यापन एनोटेशन के साथ एक साधारण वर्ग है

public class UserDTO {
    @NotEmpty
    private String name;

    @Min(18)
    private int age;

//getters/setters
}

UserDTO वैधता की जांच करने के लिए एक नियंत्रक।

@RestController
public class ValidationController {

    @RequestMapping(value = "/validate", method = RequestMethod.POST)
    public ResponseEntity<String> check(@Valid @RequestBody UserDTO userDTO,
           BindingResult bindingResult) {
        return new ResponseEntity<>("ok" , HttpStatus.OK);
    }
}

और एक परीक्षण।

@Test
public void testValid() throws Exception {
    TestRestTemplate template = new TestRestTemplate();
    String url = base + contextPath + "/validate";
    Map<String, Object> params = new HashMap<>();
    params.put("name", "");
    params.put("age", "10");

    MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
    headers.add("Content-Type", "application/json");

    HttpEntity<Map<String, Object>> request = new HttpEntity<>(params, headers);
    String res = template.postForObject(url, request, String.class);

    assertThat(res, equalTo("ok"));
}

नाम और आयु दोनों अमान्य हैं इसलिए BindingResult में हमारे पास दो सत्यापन त्रुटियां हैं। प्रत्येक के पास कोड्स हैं।

मिन चेक के लिए कोड

0 = "Min.userDTO.age"
1 = "Min.age"
2 = "Min.int"
3 = "Min"

और NotEmpty चेक के लिए

0 = "NotEmpty.userDTO.name"
1 = "NotEmpty.name"
2 = "NotEmpty.java.lang.String"
3 = "NotEmpty"

डिफ़ॉल्ट संदेशों को स्थानापन्न करने के लिए एक custom.properties फ़ाइल जोड़ें।

@SpringBootApplication
@Configuration
public class DemoApplication {

    @Bean(name = "messageSource")
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        bean.setBasename("classpath:custom");
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }

    @Bean(name = "validator")
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(messageSource());
        return bean;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

अगर हम custom.properties को लाइन में जोड़ते हैं

NotEmpty=The field must not be empty!

नया मान त्रुटि के लिए दिखाया गया है। संदेश को हल करने के लिए सत्यापनकर्ता शुरू से ही उचित संदेश खोजने के लिए कोड के माध्यम से देखता है।

इस प्रकार जब हम परिभाषित NotEmpty जहां सभी मामलों के लिए .properties फ़ाइल में महत्वपूर्ण @NotEmpty हमारा संदेश एनोटेशन प्रयोग किया जाता है लागू किया जाता है।

यदि हम कोई संदेश परिभाषित करते हैं

Min.int=Some custom message here.

सभी एनोटेशन जहां हम पूर्णांक मानों की न्यूनतम जांच करते हैं, नए परिभाषित संदेश का उपयोग करते हैं।

यदि हमें सत्यापन त्रुटि संदेशों को स्थानीय बनाने की आवश्यकता है तो वही तर्क लागू किया जा सकता है।

नेस्टेड पीओजेओ को मान्य करने के लिए @ अवैध उपयोग

मान लीजिए कि हमारे पास एक POJO वर्ग उपयोगकर्ता है जिसे हमें मान्य करने की आवश्यकता है।

public class User {

    @NotEmpty
    @Size(min=5)
    @Email
    private String email;
}

और उपयोगकर्ता उदाहरण को मान्य करने के लिए एक नियंत्रक विधि

public String registerUser(@Valid User user, BindingResult result);

चलो एक नेस्टेड POJO पते के साथ उपयोगकर्ता का विस्तार करें जिसे हमें मान्य करने की आवश्यकता है।

public class Address {

    @NotEmpty
    @Size(min=2, max=3)
    private String countryCode;
}

नेस्टेड @Valid सत्यापन को चलाने के लिए पता फ़ील्ड पर केवल @Valid टिप्पणी जोड़ें।

public class User {

    @NotEmpty
    @Size(min=5)
    @Email
    private String email;

    @Valid
    private Address address;
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow