0

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

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。我该如何解决这个问题?有更好的方法吗?

4

2 回答 2

1

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

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

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

具有完全相同的映射

用户/验证.json

一个丑陋的解决方案是将Locale locale参数添加到您的抽象控制器方法(即使您不使用它)并将@Overwrite注释添加到 UserController 方法(否则您将收到编译错误)。这样,两种方法合二为一。

于 2013-06-18T12:34:20.220 回答
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";
    }
于 2013-06-17T14:20:43.903 回答