4

私は2つのモデルを持っています:User,Project

public class Project{
    private int id;
    @NotEmpty(message="Project Name can not be empty")
    private String name;
    private User manager;
    private User operator;
    //getter/setter omitted
}

public class User{
    private int id;
    private String name;
    //omit other properties and getter/setter
}

ここで、新しいプロジェクトを作成するときに、次のパラメーターをProjectControllerに送信します。

projects?name=jhon&manager.id=1&operator.id=2...

次に、新しいProjectオブジェクトを作成し、それをdbに挿入します。

ただし、マネージャーのIDを検証する必要があり、オペレーターが有効です。つまり、ユーザーテーブルに一致するIDがあるかどうかを検証します。

だから私はこの種の検証を実装する方法を知りたいですか?


update1:​​バリデーターを使用する

これは、新しいプロジェクトを作成するためのフォームです。

<sf:form method="${project.id==0?'post':'put'}" commandName="project" action="${context}${action}">
    Manager:<sf:input path="manager.id" />  <sf:errors path="manager.id" /> <br />
    Operator:<sf:input path="operator.id" />    <sf:errors path="operator.id" />    <br />
    Name:<sf:input path="name" />   <sf:errors path="name" />   <br />
    <input type="submit" value="Submit" />
</sf:form>


@Override
public void validate(Object obj, Errors errors) {
    User user = (User) obj;
    int id=user.getId();
    User u=userDao.query(id);
    if(u==null){
        errors.rejectValue("id", "user does not exist!");
    }
}

このバリデーターは機能しているようです。

ただし、エラーメッセージをフォームに表示することはできません。

次に、デバッグを行っても結果オブジェクトを調べたところ、次のことがわかりました。

org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'project' on field 'id': rejected value [0]; codes [user does not exist!.project.id,user does not exist!.id,user does not exist!.int,user does not exist!]; arguments []; default message [null]
Field error in object 'project' on field 'id': rejected value [0]; codes [user does not exist!.project.id,user does not exist!.id,user does not exist!.int,user does not exist!]; arguments []; default message [null]

結果にエラーがあるようですが、パスはproject.id私の形式ではありますproject.manager.id

直し方?

4

4 に答える 4

4

これが1つの可能な解決策です。

以下のクラスを作成します。

...
import org.springframework.validation.Validator;
...

@Component
public class ProjectValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Project.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Project project = (Project) target;

        /* Do your checks here */
        ...

        if (managerIdDoesNotMatch) {
            errors.rejectValue("manager.id", "your_error_code");
        }

        ...

        if (operatorIdDoesNotMatch) {
            errors.rejectValue("operator.id", "your_error_code");
        }

        ...
    }
}

そして、コントローラーで次のようなことを行います。

...
public class ProjectController {

    @Autowired
    ProjectValidator projectValidator;

    ...

    @RequestMapping(...)
    public String yourCreateMethod(..., @ModelAttribute @Valid Project project, BindingResult result) {
        projectValidator.validate(project, result);           

        if (result.hasErrors()){
          // do something
        }
        else {
          // do something else
        }
    }

}

これで始められるはずです。バリデーターを別の方法でインスタンス化/設定し、ユーザーサブバリデーターを使用することもできますが、一般的な考え方は理解できます。

参照:

于 2012-09-03T11:31:22.670 に答える
2

実際にあなたがする必要があるのはアドオン@Validです

private User manager;
private User operator;

このような

@Valid
private User manager;
@Valid
private User operator;
于 2017-02-03T09:46:48.857 に答える
1

コントローラでは、カスタムバリデーターを追加できます。

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new ProjectValidator());
}

このバリデーターでは、セクション6.3の前の最後の段落で行っUserように、オブジェクトをチェックしたり、に委任したりできます。UserValidator

于 2012-09-03T11:30:07.210 に答える
0

Jerome Dalbertが提案したことを実行し、さらに、検証の実際の作業をJSR303実装に委任するためのカスタムBeanValidatorを追加しました。

プレフィックスは、フォームでプロパティのパスを示すために使用されます。

@Component
public class BeanValidator implements org.springframework.validation.Validator, InitializingBean {    

 private Validator validator;
 public void afterPropertiesSet() throws Exception {
  ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
  validator = validatorFactory.usingContext().getValidator();
 }

 public boolean supports(Class clazz) {
  return true;
 }

 public void validate(Object target, Errors errors, String prefix) {
  Set<ConstraintViolation<Object>> constraintViolations = validator.validate(target);
  for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
   String propertyPath = constraintViolation.getPropertyPath().toString();
   String message = constraintViolation.getMessage();
   errors.rejectValue(prefix + "." + propertyPath, "", message);
  }
 }

 public void validate(Object target, Errors errors) {
  validate(target, errors, "");
 }
}

そしてここで私がUserValidatorでそれをどのように使用したか:

@Component
public class UserValidator implements Validator {

 @Autowired
 BeanValidator beanValidator;

 @Override
 public boolean supports(Class<?> clazz) {
  return User.class.equals(clazz);
 }

 @Override
 public void validate(Object target, Errors errors) {
  User user = (User) target;
  beanValidator.validate(user.getAddress(), errors, "address");
 }
}

参照:

于 2013-12-28T08:24:30.050 に答える