【问题标题】:How to use different validations depending the button pressed如何根据按下的按钮使用不同的验证
【发布时间】:2014-07-24 07:01:06
【问题描述】:

我有这个。

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中有2个表单,第一个只使用SomeEntity1,第二个使用SomeEntity2。如何在同一控制器中进行单独验证?这是可能的?。我的主要问题是,如果我尝试验证 SomeEntity2 它会尝试验证第一个并且为 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
    }

【问题讨论】:

  • 拜托,你能发布你的控制器代码吗?

标签: java validation spring-mvc


【解决方案1】:

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

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

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

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

    // ...
}

【讨论】:

  • 这可行,但我在验证器中有一个注入服务,new 为空
  • 您可以将您的验证器注释为@Component 并将它们自动连接到您的控制器。所以你不需要在控制器方法中实例化它们。
【解决方案2】:

如果您使用异或外键,您的数据模型可能是错误的。使用继承。您还应该使用 POST 而不是 GET 来提交表单。

你应该使用验证组和 Spring 的 @Validated 注解:

Scenario1.class:

public interface Scenario1 extends Default() {};

Scenario2.class:

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)) { 
    ...
}

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多