2016-06-16 17 views
0
によって
@Controller 
@EnableWebMvc 
@Validated 
public class ChildController extends ParentController<InterfaceController> implements InterfaceController{ 

    @Override 
    @RequestMapping(value = "/map/{name}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    @ResponseBody 
    public List<Friends> getAllFriendsByName(
     @Valid 
     @Size(max = 2, min = 1, message = "name should have between 1 and 10 characters") 
     @PathVariable("name") String name, 
     @RequestParam(value="pageSize", required=false) String pageSize, 
     @RequestParam(value="pageNumber", required=false) String pageNumber,    
     HttpServletRequest request) throws BasicException { 

    //Some logic over here; 

    return results; 
    } 

@ExceptionHandler(value = { ConstraintViolationException.class }) 
@ResponseStatus(value = HttpStatus.BAD_REQUEST) 
public String handleResourceNotFoundException(ConstraintViolationException e) { 
    Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); 
    StringBuilder strBuilder = new StringBuilder(); 
    for (ConstraintViolation<?> violation : violations) { 
     strBuilder.append(violation.getMessage() + "\n"); 
    } 
    return strBuilder.toString(); 
} 

を検証されていない、私は春のリクエストパラメータにかなり基本的な検証を行うにしようとしていますが、単に例外ハンドラを呼び出すようには見えない、誰かのポイントができました私は正しい方向に私を春RESTサービスコントローラがHi @PathVariableと@Valid

PS私はNoHandlerFoundExceptionを取得し続ける

答えて

1

春は@Validを使用して@PathVariableを検証することをサポートしていません。ただし、ハンドラメソッドでカスタム検証を実行するか、@Validを使用してカスタムエディタを作成し、パス変数値をオブジェクトに変換し、JSR 303 bean検証を使用して、そのオブジェクトに対して@Validを使用できます。それは実際に動作するかもしれません。

編集: ここに第3のアプローチがあります。実際には、バネをトリックしてパス変数をモデル属性として扱い、それを検証することができます。 1.パス変数のカスタムバリデータを書き込む 2.パス変数の@ModelAttributeを作成し、そのモデル属性に@Validator(バリデータを指定できないため、@Validはありません)を使用します。

@Component 
public class NameValidator implements Validator { 
    @Override 
    public boolean supports(Class<?> clazz) { 
     return String.class.equals(clazz); 
    } 
    @Override 
    public void validate(Object target, Errors errors) { 
     String name = (String) target; 
     if(!StringUtils.isValidName(name)) { 
      errors.reject("name.invalid.format"); 
     } 
    } 
} 

@RequestMapping(value = "/path/{name}", method = RequestMethod.GET) 
public List<Friend> getAllFriendsByName(@ModelAttribute("name") @Validated(NameValidator.class) String name) { 
    // your code 

    return friends; 
} 

@ModelAttribute("name") 
private String nameAsModelAttribute(@PathVariable String name) { 
    return name; 
} 
+0

カスタムエディタとはどういう意味ですか?そして、JSR303の注釈ではありません。 –

+0

パス変数を通常のBeanに変換するための 'PropertyEditor'または' org.springframework.format.Formatter.Formatter'を意味しました。そうです。@ SizeはJSR 303アノテーションです。あなたはpath変数が実際のURLの一部であることを知っているので、springは自然に有効と見なしますが、検証したい場合でもそれらはあなたのオプションです。 – mushfek0001

+0

これは、この例または回答が間違っていることを意味しますか? http://stackoverflow.com/questions/35403744/pathvariable-validation-in-spring-4 –

関連する問題