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
,并将它们自动连接到你的控制器。所以您不需要在控制器方法中实例化它们。