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

回答

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方法(否则将会出现编译错误)。这样两种方法就成为一种了。

+0

感谢您指出差异,我完全错过了这一点。 – abiieez

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"; 
    } 
+0

我的想法是扩展通用控制器类,以便我可以重用这段代码。是的,UserController用@Controller和@RequestMapping(“user”)注释。 – abiieez

+0

你的想法是正确的...这个作品。所以在执行时肯定会出现一些问题 – NimChimpsky

+0

在上下文初始化期间我收到异常。我应该检查哪个领域的实施? – abiieez