2
私のbeanのフィールドを単純に検証し、手動で行うのではなく、Spring検証をチェックアウトしたいが、今のところ運がない。要するに春 - @Validでの妥当性検査は決して呼び出されません
:私はのメソッドを呼び出すとき@Valid
注釈付き
検証が呼び出されることはありませんように見える私の@RestController
マイコード:
pom.xml
(検証の部分について)
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
春はバージョン4.1.1
バリ
package myPackage;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/users")
public class UsersController {
public UsersController() {
}
//tried to put @InitBinder, but no luck
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UtenteValidator());
}
@ResponseBody
@RequestMapping(value="", method=RequestMethod.PUT)
public <T> ResponseEntity<T> aggiornaUtente(@RequestBody @Valid UtenteLite utente, BindingResult result)
{
ResponseEntity<T> responseEntity=null;
return responseEntity;
}
}
テBindingResult
結果オブジェクトは常にゼロエラーとvalidate
、supports
またはinitBinder
メソッドが呼び出されることはありませんを示し
package mypackage;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
public class UtenteValidator implements Validator{
public UtenteValidator() {
// TODO Auto-generated constructor stub
}
@Override
public boolean supports(Class<?> clazz) {
return UtenteLite.class.equals(clazz);
}
//validation test
@Override
public void validate(Object target, Errors errors) {
UtenteLite user = (UtenteLite) target;
if(user.getName != "foo") {
errors.rejectValue("name", "name not correct");
}
}
}
コントローラです。
@InitBinderメソッドが呼び出されるは、だから私は空あるを:
読み取り、このtutorialを発見されましたか?
@InitBinder注釈付きメソッド私たちはこの注釈の「価値」 要素を指定しない場合 は、各HTTP要求に呼び出されます。
WebDataBinder引数は、モデル属性に固有のものです。これは、モデルの属性がSpringによって作成されるたびに を意味します。このメソッドは、WebDataBinderの新しいインスタンスで呼び出される を取得します。
@ModelAttribute
とNOW検証コードが呼び出されるしかしrequestBodyオブジェクト(「utente」オブジェクト)を追加これに私のコントローラメソッドを変更しようとしましたので、検証は常にフィールドがあるため、失敗しましたすべてのヌルは: @ResponseBody
@RequestMapping(value="", method=RequestMethod.PUT)
public <T> ResponseEntity<T> aggiornaUtente(@RequestBody @Valid @ModelAttribute("utente") UtenteLite utente, BindingResult result)
{
...
}
utente
メソッドのパラメータは、リクエストのボディとしてJSONに渡されます。
私はpom.xmlにhibernate-validation artifactリファレンスを追加するだけで解決しました 追加するのを忘れてしまった:\ 質問を編集して解決情報を入れるか、それとも答えるべきか分かりません。 – frankieta