2011-12-29 26 views
2

我正在編寫Web應用程序,它使用Spring MVC將Spring bean與類似REST的通道綁定。Spring MVC 3.1.0錯誤?升級後控制器不再被自動檢測

我已經在我以前的應用程序(純XML配置)和示例中創建了基本配置,其中使用了<mvc:annotation-driven/>功能。我在spring xml文件中指向一個包含<context:component-scan base-package="my.package"/>控制器的包。

它正在工作 - 在春季3.0.6.RELEASE。但是,升級到3.1.0.RELEASE我的控制器停止檢測,並且沒有註冊通道。 Spring上下文不包含實現的接口。

這是一個在這個春天版本中的錯誤,或者我使用的是不推薦使用的配置,在新版本中停止使用它?我沒有錯誤或警告,只是沒有自動檢測到bean。

控制器接口定義看起來像這樣:

@RequestMapping("/config") public interface ConfigChannel 

和實現:

@Controller 
public class ConfigChannelImpl implements ConfigChannel 
+0

你可以請出示控制器 – 2011-12-29 12:48:30

+0

@JigarJoshi的代碼添加接口並實現了一套 – 2011-12-29 12:57:24

+0

的聲明你知道,如果這個問題是不是正在創建的豆,或者是否MVC:註釋驅動程序未能提取您的請求映射? – waxwing 2011-12-29 13:04:23

回答

2

Spring文檔表明,基於接口的@Controller s爲用於代理事務方法。因此,您可能正在使用<tx:annotation-driven />標籤。你現在看到的問題是Spring 3.1引入了對基於運行時字節碼操作符CGLIB的支持。您需要將proxy-target-class="true"添加到您的事務配置中,並將CGLIB添加到您的類路徑中。

<tx:annotation-driven proxy-target-class="true" /> 

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping

+0

我不需要在課堂上使用代理,我在過去遇到過問題,所以我現在總是使用接口進行代理。我只需要檢測此接口實現並將其連接到Spring MVC引擎。 – 2011-12-29 15:09:08

+0

不過,這個要求仍然存在。 CGLIB是Spring 3.1在運行時如何管理這種關係。 – 2011-12-29 15:11:16

+0

是的,您的解決方案已爲我工作。我不得不添加spring-tx模式和tx:註釋驅動程序,儘管我不在此上下文中使用它。在簡單添加檢測到的cglib bean後,將其放入spring上下文中,但未添加到MVC servlet中。現在,它的工作原理,我希望我不會有代理目標級別的任何問題。 – 2011-12-30 10:56:25