Java 如何根据按下的按钮使用不同的验证

Java 如何根据按下的按钮使用不同的验证,java,validation,spring-mvc,Java,Validation,Spring Mvc,我有这个 public class ExampleForm implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer idexample; private String name; private SomeEntity1 someEntity1; private SomeEntity2 someEntity2

我有这个

public class ExampleForm implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private Integer idexample;

    private String name;

    private SomeEntity1 someEntity1;

    private SomeEntity2 someEntity2;

    // Constructor, getters and  setters...

}
jsp中有两个表单,第一个只使用
sometentity1
,第二个使用
sometentity2
。如何在同一控制器中验证单独的?有可能吗?。我的主要问题是,如果我试图使sometentity2有效,那么它将尝试使第一个有效,并且为Null

编辑:添加控制器代码

@InitBinder
protected void initBinder(final WebDataBinder binder) {

        final CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
        binder.registerCustomEditor(Date.class, editor);
        if (binder.getTarget() instanceof ExampleForm) {
            binder.setValidator(this.ExampleValidator);
        }
    }

@RequestMapping(value = "/ex/addEntity1", method = RequestMethod.GET)
public String addfirst(@Valid @ModelAttribute final ExampleForm exampleForm, final ModelMap model, final HttpSession session) {

        //Do some stuff
    }

@RequestMapping(value = "/ex/addEntity2", method = RequestMethod.GET)
public String addsecond(@Valid @ModelAttribute final ExampleForm exampleForm, final ModelMap model, final HttpSession session) {

        //Do some stuff
    }

在您的情况下,为每个实体实现不同的s可能会很有用,而不是使用
@Valid
注释

然后在控制器方法中,编写类似的代码:

public String addEntityX(@ModelAttribute final ExampleForm exampleForm, BindingResult result) {

    new EntityXValidator().validate(exampleForm, result);
    if (result.hasErrors()) {
        // ...
    }
    else{
        // ...
    }

    // ...
}

如果使用的是独占键或外键,则数据模型可能错误。使用继承。您还应该使用POST not GET提交表单

您应该使用验证组和Spring的@Validated注释:

场景1.2类:

public interface Scenario1 extends Default() {};
场景2.2类:

public interface Scenario2 extends Default()  {};
ExampleForm.class:

public class ExampleForm implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private Integer idexample;

    private String name;

    @NotNull( groups = { Scenario1.class } )
    private SomeEntity1 someEntity1;

    @NotNull( groups = { Scenario2.class } )
    private SomeEntity2 someEntity2;

    // Constructor, getters and  setters...

}
控制器:

/* if users clicks submit button named "scenario1" */
@RequestMapping( method = RequestMethod.POST, params="scenario1" )
  String publish( @Validated({Scenario1.class}) ExampleForm exampleForm, BindingResult result)) { 
    ...
}

/* if user clicks submit button named "scenario2" */
@RequestMapping( method = RequestMethod.POST, params="scenario2" )
  String publish( @Validated({Scenario2.class}) ExampleForm exampleForm, BindingResult result)) { 
    ...
}

请,你能发布你的控制器代码吗?这是可行的,但我在验证器中有一个注入服务,使用
new
它是空的。你可以将验证器注释为
@Component
,并将它们自动连接到你的控制器。所以您不需要在控制器方法中实例化它们。