2012-01-21 11 views
2

内の豆を検証するために、私は次のマッピングハンドラを持っている:春:どのようにArrayListの

@Controller 
@RequestMapping("/product") 
public class ProductController { 

    @RequestMapping(value = "update", method = RequestMethod.POST) 
    @ResponseBody 
    public Map<String, ?> update(@Valid @RequestBody ListOfProduct productList) { 

     if (productDao.saveOrUpdateAll(productList)) { 
       return jsonUtils.statusMessage(true, "Updated successfully."); 
      } 

     return jsonUtils.statusMessage(false, "Failed."); 
    } 

    @ExceptionHandler 
    @ResponseStatus(value = HttpStatus.BAD_REQUEST) 
    @ResponseBody 
    public String handleMethodArgumentNotValidException(MethodArgumentNotValidException error) { 
     return "Bad request: " + error.getMessage(); 
    } 

    public static class ListOfProduct extends ArrayList<Product> { 
     private static final long serialVersionUID = 1L; 

     public ListOfProduct() { 
      super(); 
     } 
    } 
} 

@Entity 
public class Product implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Min(1) 
    private int id; 

    @NotNull 
    @Size(min = 5) 
    private String name; 

    public product() { 
    } 

     // getters and setters 
} 

私はこのJSONを検証しようとしている:

[{"id":6, "name":""}] 

制約の違反であると考えられます"name"プロパティの@Size。

コントローラー内でハンドル番号handleMethodArgumentNotValidException()によって処理されるはずです。

しかし、その代わりに、私はこの例外ました:

Jan 21, 2012 10:25:00 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/WebTest] threw exception [Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.tes.web.entity.Product] during update time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='size must be between 5 and 2147483647', propertyPath=name, rootBeanClass=class com.tes.web.entity.Product, messageTemplate='{javax.validation.constraints.Size.message}'} 
]] with root cause 
javax.validation.ConstraintViolationException: Validation failed for classes [com.tes.web.entity.Product] during update time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='size must be between 5 and 2147483647', propertyPath=name, rootBeanClass=class com.tes.web.entity.Product, messageTemplate='{javax.validation.constraints.Size.message}'} 
] 

どれ提案がどのようにこれを解決するの?

ありがとうございました。

答えて

1

ログの例外はjavax.validation.ConstraintViolationExceptionですが、例外ハンドラは例外タイプMethodArgumentNotValidExceptionです。 ConstraintViolationExceptionのハンドラを宣言してください。

+0

はい、そうです。しかし、 'MethodArgumentNotValidException'をスローすることになっています。 'ConstraintViolationException'が' MethodArgumentNotValidException'の代わりにスローされると、 'update()'メソッドの '@ Valid'アノテーションが役に立たないことを意味します(検証は春には行われません)。 –

+0

他の方法で検証を呼び出さない限り、実際に検証がSpringによってトリガーされると思います(Spring MVCはSpringで導入された 'MethodArgumentNotValidException'の間に、3.0.xでも '@ Valid'によってトリガーされた検証を実行しました3.1)。私はどの設定/設定がどの例外をスローするかを考えることはできません。 – Gunnar

1

@RequestBodyの@Validは、実際にはMethodArgumentNotValidExceptionを引き起こすはずです。 RequestResponseBodyMethodProcessor 74行目に改行を入れてみてください。問題があると思われる場合は、JIRAで報告してください。