覆盖通用控制器

时间:2013-06-13 09:20:33

标签: spring-mvc

我在抽象控制器中有以下功能

public abstract class GenericController<T extends PersistentObject> {
    ...
    ...
    ...
    @RequestMapping(value = "/validation.json", method = RequestMethod.POST)
    @ResponseBody
    public ValidationResponse ajaxValidation(@Valid T t, BindingResult result) {
        ValidationResponse res = new ValidationResponse();
        if (!result.hasErrors()) {
            res.setStatus("SUCCESS");
        } else {
            res.setStatus("FAIL");
            List<FieldError> allErrors = result.getFieldErrors();
            List<ErrorMessage> errorMesages = new ArrayList<ErrorMessage>();
            for (FieldError objectError : allErrors) {
                errorMesages.add(new ErrorMessage(objectError.getField(),
                        objectError.getDefaultMessage()));
            }
            res.setErrorMessageList(errorMesages);
        }
        return res;
    }

在大多数情况下,验证对于不同类型的实体是足够的。现在我想在我的具体控制器上自定义验证

@Controller
@RequestMapping("user")
public class UserController extends GenericController<User> {

    @RequestMapping(value = "/validation.json", method = RequestMethod.POST)
    @ResponseBody
    public ValidationResponse ajaxValidation(@Valid User user,
            BindingResult result, Locale locale) {
        ValidationResponse res = super.ajaxValidation(user, result);
        if (!user.getPassword().equals(user.getConfirmPassword())) {
            res.setStatus("FAIL");
            res.getErrorMessageList().add(
                    new ErrorMessage("confirmPassword", messageSource
                            .getMessage("password.mismatch", null, locale)));
        }
        return res;
    }
}

有了这个,我收到以下错误java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController' bean method。我该如何解决这个问题?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这里的问题是,在扩展通用控制器后,您有两个 不同的 方法

public ValidationResponse ajaxValidation(@Valid T t, BindingResult result)

public ValidationResponse ajaxValidation(@Valid User user,
        BindingResult result, Locale locale)

具有完全相同的映射

  

用户/ validation.json

一个丑陋的解决方案是将Locale locale param添加到抽象控制器方法中(即使你不使用它)并将@Overwrite注释添加到UserController方法(你会得到)否则编译错误)。这样两种方法就变成了一种。

答案 1 :(得分:0)

通用控制器是否被其他类扩展?然后,您将有两个相同的请求映射。

您确定UserController正确地应用了用户前置请求映射吗?这有效:

@RequestMapping("test")
public class ExampleController extends AbstractController {
@RequestMapping(value = "/Home", method = RequestMethod.GET)
    public String getHome(Model model) {
        return "home";
    }

在AbstractController中使用相同的映射

@RequestMapping(value = "/Home", method = RequestMethod.GET)
    public String getHome(Model model) {
        return "home";
    }