2013-06-13 174 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