我正在使用 Spring MVC 创建可视化编辑器 Web 应用。
可视化有一些属性:
public class VisualizationProperties {
double strokeWidth = 1;
Rectangle selectedArea;
}
每个浏览器 session 都应该有一个,所以我将它定义为一个 session 范围的 bean:
@Component
@Scope("session")
public class VisualizationProperties {
...
因为我想从服务访问它...
@Service
public class VisualizationService {
@Resource
private VisualizationProperties properties;
public void createVisualization () {
//create visualization using properties
...
}
}
...我通过代理定义访问:
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class VisualizationProperties {
...
将成员设为私有(private)并向其添加 getters + setters。
到目前为止很完美。
现在我希望客户端能够读取和更新属性。
所以我将 bean 更改为 Controller 并添加访问自身的方法:
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class VisualizationProperties {
private double strokeWidth = 1;
private Rectangle selectedArea;
... //getters + setters
@RequestMapping(value="/properties", method=RequestMethod.GET)
public @ResponseBody VisualizationProperties getProperties () {
return this;
}
@RequestMapping(value="/properties", method=RequestMethod.POST)
public @ResponseBody void setProperties (@RequestBody VisualizationProperties newProperties) {
this.strokeWidth = newProperties.strokeWidth;
this.selectedArea = newProperties.selectedArea;
}
}
在启动时导致以下异常:
IllegalStateException:发现不明确的映射。
无法将“visualizationProperties”bean 方法 getProperties() 映射到 {[/properties],methods=[GET],...}:
已经有 'scopedTarget.visualizationProperties' bean 方法。
这是为什么?
最佳答案
这里的问题有两个方面。首先,您要注释一个已经用 @Controller
注释的类。
@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class VisualizationProperties {
其次,您正在使用范围代理。在这种情况下,Spring 将注册两个 bean 定义。一个名为 visualizationProperties
的实际 bean,另一个名为 scopedTarget.visualizationProperties
的名称将充当 FactoryBean
以创建代理。
处理程序方法注册过程(对于 @Controller
beans 和 @RequestMapping
方法)通过在上下文中查找所有 bean names 来工作,找到它们的类型,扫描该类型的方法并注册这些方法(如果它们用 @RequestMapping
注释)。
由于 Spring 将 visualizationProperties
和 scopedTarget.visualizationProperties
bean 名称解析为 VisualizationProperties
类型的 bean,它具有 @RequestMapping
注释方法,它会尝试同时注册这两个方法,由于映射冲突而在第二个失败(你不能将两个处理程序映射到同一个请求)。
我建议的解决方案是重构并创建一个专用的 @Controller
类(未代理),该类委托(delegate)给 session 范围内的 VisualizationProperties
bean。
关于java - Spring MVC,使用基于类的代理的作用域 Controller : 'There is already scopedTarget bean method.' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435448/