【发布时间】:2013-12-07 08:15:33
【问题描述】:
我正在使用 Spring MVC 创建一个可视化编辑器 Web 应用程序。
可视化具有一些属性:
public class VisualizationProperties {
double strokeWidth = 1;
Rectangle selectedArea;
}
每个浏览器会话都应该有一个,因此我将其定义为会话范围的 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 {
...
将成员设为私有并为其添加 getter + setter。
到目前为止完美。
现在我希望客户端能够读取和更新属性。
所以我把bean改成控制器并添加方法来访问自己:
@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: Ambiguous mapping found.
Cannot map 'visualizationProperties' bean method getProperties() to {[/properties],methods=[GET],...}:
There is already 'scopedTarget.visualizationProperties' bean method.
这是为什么呢?
【问题讨论】:
-
可行的替代方案:将访问方法移动到不同的控制器(放弃封装)或使用
proxyMode=ScopedProxyMode.INTERFACES并将属性 POJO 移动到VisualizationPropertiesImpl并引入它的接口(不需要的开销)。其他想法?
标签: java session spring-mvc spring-annotations