我在抽象控制器中有以下功能
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
。我该如何解决这个问题?有更好的方法吗?
答案 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";
}