Self-made Validation with Spring

background

Make a note of the validation method other than annotating the Form (double check, etc.). This time we will use Spring Validator instead of Bean Validation.

Method

SessionForm


public class SessionForm {

    private CheckForm checkForm;
    //Variable for error output
    private String error1;

    private String error2;
    //Setter etc. omitted

CheckValidation


@Component
                             //Interface implementation
public class CheckValidation implements Validator {
    //Inject when using helper for Check
    @Autowired
    Helper helper;

    @Override
    public boolean supports(Class<?> clazz) {
        //Enter the Form you want to check(Session attributed class)
        //isAssignableFrom includes all inherited classes
        return SessionForm.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        //Create the target class once
        SessionForm form = (SessionForm) target;
        //form.checkForm.~Nested elements can also be used by
        if (Conditional expression) {
                errors.rejectValue(
                       //Variable specified in the form
                       "error1",
                       //Null if the message is not defined in another file
                        null, 
                       "Message you want to output");
            }

        //Do another check
        if (Conditional expression) {
                errors.rejectValue(
                        "error2", 
                         null, 
                        "Message you want to output");
                }
}
          

Controller


@Controller
@SessionAttributes(names = "sessionForm")
public class ExampleController {
    //For key setting
    private static final String FORM_NAME = "sessionForm";

    //Inject your own validation class
    @Autowired
    CheckValidation checkValidation;

    //Added to WebDataBinder
    @InitBinder("sessionForm")
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(checkValidation);
    }
    
    //The mode attached to the method adds a place to the model before calling
    @ModelAttribute(value = "sessionForm")
    public SessionForm sessionForm() {
        return new SessionForm();
    }

//a
@RequestMapping(path="The path you put in the redirect", method=RequestMethod.GET)
    public String putInformation(@ModelAttribute(FORM_NAME) SessionForm session, BindingResult result,ModelMap model) {

        String key = BindingResult.MODEL_KEY_PREFIX + FORM_NAME;
        //If there is an error in the model when redirecting
        if(model.containsKey("errors")) {
            //Error storage in map format in the form set in Key
            model.addAttribute(key, model.get("errors"));
            model.addAttribute("sessionForm" , session);
            return "JSP etc. you want to transition";
        }
        //Others omitted
}

//b
@RequestMapping(path="Input confirmation screen, etc.", method=RequestMethod.POST)
    public String confirmInfomation(@Validated SessionForm session, BindingResult result, Model model, RedirectAttributes ra)throws Exception {

            if(result.hasErrors()) {
            ra.addFlashAttribute("errors", result);
            //Redirect to input screen
            return "redirect:/{To the path of the controller you want to call}";
        }
        //Others omitted
}

JSP


<form:errors path="error1" />
<form:errors path="error2" />

Note

-First, create variables for errors on the full form. -Information is stored in the variable in the validator class. -By adding a validator to WebDataBinder with the controller, the validator added after calling Bean Validation is called and the self-made check is performed. Don't forget Autowired. -If there is an error in BindingResult, redirect while retaining that information (check the part before transitioning to the input confirmation screen, etc.). The method flow is in the order of a → b → a. -Branch depending on the presence or absence of an error in the redirect destination method, and if there is, store the error information in the model and share it with the JSP. -Use errors of form tag in JSP, match the path and the variable of the session form, and output the error message.

Summary

This time, I created it through trial and error, so I think there is a better way, but I made a note because it worked. I was able to compare it with the information (date, etc.) brought from the DB in the validator class, so I thought that the validator had a high degree of freedom. If you want to implement a validator other than Spring, I thought you should write a condition using a filter or something.

Recommended Posts

Self-made Validation with Spring
Form class validation test with Spring Boot
Spring with Kotorin --- 5. Actuator
JSON validation with JSON schema
Collective handling of Spring validation errors with @ControllerAdvice
[Java] Article to add validation with Spring Boot 2.3.1.
Spring with Kotorin ―― 1. SPRING INITIALIZR
Download with Spring Boot
[JUnit 5] Write a validation test with Spring Boot! [Parameterization test]
Spring validation and error code
Hello World with Spring Boot
Java Config with Spring MVC
Process validation messages with Decorator
Implement GraphQL with Spring Boot
Spring with Kotorin --8 Repository layer
Get started with Spring boot
Hello World with Spring Boot!
Spring with Kotorin --6 Asynchronous processing
Run LIFF with Spring Boot
File upload with Spring Boot
Spring Boot starting with copy
Spring with Kotorin ―― 7. Service layer
Login function with Spring Security
Spring Boot starting with Docker
Hello World with Spring Boot
Set cookies with Spring Boot
Use Spring JDBC with Spring Boot
Add module with Spring Boot
Getting Started with Spring Boot
Link API with Spring + Vue.js
Create microservices with Spring Boot
Spring single item validation test
Send email with spring boot
Spring Boot validation message changes
Use Basic Authentication with Spring Boot
Implemented authentication function with Spring Security ②
Implemented authentication function with Spring Security ③
Create an app with Spring Boot 2
Hot deploy with Spring Boot development
Database linkage with doma2 (Spring boot)
Spring Boot programming with VS Code
Until "Hello World" with Spring Boot
Inquiry application creation with Spring Boot
Implemented authentication function with Spring Security ①
Implement file download with Spring MVC
Oauth2 authentication with Spring Cloud Gateway
Add Bean Validation with Micronaut (Java)
Easy input check with Bean Validation!
(Intellij) Hello World with Spring Boot
Create an app with Spring Boot
Spring with Kotorin --9 Database migration --Flyway
Google Cloud Platform with Spring Boot 2.0.0
I tried GraphQL with Spring Boot
[Java] LINE integration with Spring Boot
[Spring] Autowired multiple beans. (With bonus)
Beginning with Spring Boot 0. Use Spring CLI
I tried Flyway with Spring Boot
Authentication / authorization with Spring Security & Thymeleaf
Test Spring framework controller with Junit
About error when implementing spring validation
Message cooperation started with Spring Boot