Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有两个对象的Spring表单验证_Java_Spring_Validation_Thymeleaf - Fatal编程技术网

Java 具有两个对象的Spring表单验证

Java 具有两个对象的Spring表单验证,java,spring,validation,thymeleaf,Java,Spring,Validation,Thymeleaf,Spring Boot应用程序出现了一个复杂的问题,我已经尝试解决了一段时间了,我希望有人能帮助我。我已经删除了项目的所有其他部分,并试图使其尽可能简单。如果您转到localhost:8080,将有一个表单,其中有两个文本框,可以输入两个名称,还有一个提交按钮。第一个名称将存储在被提名者对象中,第二个名称存储在提交者对象中。单击“提交”时,它将对字段执行验证,以确保它们都不是空的。我将在下面发布代码,并在最后解释我的问题 Application.java @SpringBootApplicati

Spring Boot应用程序出现了一个复杂的问题,我已经尝试解决了一段时间了,我希望有人能帮助我。我已经删除了项目的所有其他部分,并试图使其尽可能简单。如果您转到localhost:8080,将有一个表单,其中有两个文本框,可以输入两个名称,还有一个提交按钮。第一个名称将存储在被提名者对象中,第二个名称存储在提交者对象中。单击“提交”时,它将对字段执行验证,以确保它们都不是空的。我将在下面发布代码,并在最后解释我的问题

Application.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
WebController.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
namedee.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
ior.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
Submitter.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
SubmitterValidator.java

@SpringBootApplication
@EnableJms
@EnableWebMvc
public class Application {

    public static void main(String[] args) throws Exception {
        // Launch the application
        SpringApplication.run(Application.class, args);
    }
}
@Controller
public class WebController extends WebMvcConfigurerAdapter {
    protected static final Logger LOG = LoggerFactory.getLogger(WebController.class);

    @InitBinder("nominee")
    protected void initNomineeBinder(WebDataBinder binder) {
        binder.setValidator(new NomineeValidator());
    }

    @InitBinder("submitter")
    protected void initSubmitterBinder(WebDataBinder binder) {
        binder.setValidator(new SubmitterValidator());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/success").setViewName("success");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(Model model) {
        model.addAttribute("nominee", new Nominee());
        model.addAttribute("submitter", new Submitter());
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                                  @ModelAttribute(value="submitter") @Valid Submitter submitter,
                                  BindingResult bindingResult, @Valid Model model) {
        LOG.info("Nominee to string: " + nominee.toString());
        LOG.info("Submitter to string: " + submitter.toString());
        LOG.info("bindingResult to string: " + bindingResult.toString());
        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/success";
    }
}
import lombok.Data;

@Data
public class Nominee {
    private String name;
}
public class NomineeValidator implements Validator {

    public boolean supports(Class clazz) {
        return Nominee.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", "name", "This field is empty.");
    }
}
import lombok.Data;

@Data
public class Submitter {
    private String sname;
}
public class SubmitterValidator implements Validator {

    public boolean supports(Class clazz) {
        return Submitter.class.equals(clazz);
    }

    public void validate(Object object, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "sname", "sname", "This field is empty.");
    }
}
form.html


提名人详情
姓名:

空字段

你的细节 你的名字:

空字段

提交提名
通常的情况是在这种情况下使用Dto对象。这意味着您创建了一个包含所有相关表单字段的对象,并基于此进行验证

例如:

@Data
public class MyDto {

    private Nominee nominee;

    private Submitter submitter;
}

@RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@Valid MyDto dto, BindingResult bindingResult) {
    LOG.info("Nominee to string: " + dto.getNominee().toString());
    LOG.info("Submitter to string: " + dto.getSubmitter().toString());
    LOG.info("bindingResult to string: " + bindingResult.toString());
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "redirect:/success";
}
此外,您还可以向控制器添加类似的内容

@ExceptionHandler(Throwable.class)
public ModelAndView processError(Throwable ex) {
    ex.toString();
    // do something and return a ModelAndView object as you like.
}

找到了解决办法。在WebController中,checkPersonInfo需要为每个正在验证的对象提供单独的BindingResult。BindingResult需要位于紧跟在每个@Valid对象之后的方法参数中

因此,在WebController.java中:

    @RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                              @ModelAttribute(value="submitter") @Valid Submitter submitter,
                              BindingResult bindingResult, @Valid Model model) {
    LOG.info("Nominee to string: " + nominee.toString());
    LOG.info("Submitter to string: " + submitter.toString());
    LOG.info("bindingResult to string: " + bindingResult.toString());
    if (bindingResult.hasErrors()) {
        return "form";
    }

    return "redirect:/success";
}
需要做到这一点:

    @RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@ModelAttribute(value="nominee") @Valid Nominee nominee,
                              BindingResult bindingResultNominee,
                              @ModelAttribute(value="submitter") @Valid Submitter submitter,
                              BindingResult bindingResultSubmitter) {
    LOG.info("Nominee to string: " + nominee.toString());
    LOG.info("Submitter to string: " + submitter.toString());
    if (bindingResultNominee.hasErrors() || bindingResultSubmitter.hasErrors()) {
        return "form";
    }

    return "redirect:/success";
}

(模型对象已被删除,因为它从未在任何地方实际使用过,如果需要使用@Valid对其进行验证,则需要添加第三个BindingResult对象。)

试着打开
org.springframework.web
的日志,以调试控制台是否有什么有趣的内容。只是想知道。你为什么要进行服务器端验证而不是客户端验证(基于javascript),这没有真正的原因。第一次使用Spring Boot,只是玩它来教自己它是如何工作的,看到它有自己的表单验证实现,就想尝试让它工作。此外,要在
提名者
提交者
中使用来自
javax.validation
的验证,必须向每个属性添加
@Valid
。否则会引发ValidationException,但不会由任何
@Valid
-注释处理。