2017-10-25 4 views
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結果オブジェクトは常にゼロエラーとvalidatesupportsまたは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に渡されます。

+0

私はpom.xmlにhibernate-validation artifactリファレンスを追加するだけで解決しました 追加するのを忘れてしまった:\ 質問を編集して解決情報を入れるか、それとも答えるべきか分かりません。 – frankieta

答えて

関連する問題