我在寻找对这个问题的更好的理解。一个解决方法非常简单,即将配置数据移动到另一个没有代理/建议的类中,但是我认为更好地理解这将帮助我避免将来出现其他相关问题,所以我希望不管任何解释可以提供。为什么Spring @Value与@Controller不兼容?
我在Spring STS和vFabric tc服务器上使用Spring 3.1.0.RELEASE。使用@Controller类实现一个基本的小型REST服务器。这非常棒(实际上是这样),但@Controller也是@Transactional,并且在加载时间编织和vFabric tc服务器之间,它打破了@Value。
@Controller
@RequestMapping("/hello")
public class MyAPI {
@Value("${my.property}")
private String prop;
...
@Transactional
handleRequest(...) ...
}
而且属性文件app.properties:
my.property = SUCCESS
这JUnit的下正常工作,与测试越来越有支撑设置为“成功”一MyAPI对象。但是当应用程序被加载到vFabric中时,我猜测它会加载时间编织和代理。无论发生什么事情,都会创建两个MyAPI实例,其中一个具有prop ==“SUCCESS”,另一个(不幸是处理http请求的那个)具有prop ==“$ {my.prop}”。
总而言之,我称之为魔法失败,这是我最喜欢使用AOP之类的东西。即使使用STS,我也不知道如何找出问题背后的原因,或者找出这是一个严重的错误。如果它是一个bug,我不知道它是否是Spring,AspectJ,加载时织布工或vFabric中的一个bug,所以我甚至不知道在哪里提交错误报告。
因此,任何帮助理解这一点,将不胜感激。谢谢。
你确定它是由AOP引起的吗?如果删除'@ Transactional'会怎么样? – axtavt 2012-04-11 08:50:17
@axtavt你指出我的解决方案[这里](http://stackoverflow.com/a/4335438/712765)。在下面全部看到我的答案,但简短的答案是'Controller's单独在我的(错误)配置中创建两次。 '@ Transactional'不是问题,因为它使用AspectJ而不是代理。 – 2012-04-12 02:55:38