Spring: как проверять бины внутри ArrayList - PullRequest
2 голосов
/ 21 января 2012

У меня есть следующий обработчик отображения:

@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":""}]

Предполагается, что это нарушение для ограничения @Size of "name "property.

И он должен обрабатываться 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}'}
]

Любое предложение, как решить эту проблему?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 25 января 2012

@ Действительный для @RequestBody действительно должен приводить к исключению MethodArgumentNotValidException. Попробуйте поставить разрыв в строке RequestResponseBodyMethodProcessor 74. Если вы считаете, что существует проблема, сообщите об этом в JIRA.

1 голос
/ 21 января 2012

Исключением в вашем журнале является javax.validation.ConstraintViolationException, но ваш обработчик исключений предназначен для типа исключения MethodArgumentNotValidException.Я думаю, что вы должны попытаться объявить свой обработчик для ConstraintViolationException.

...