java - Spring MVC,使用基于类的代理的作用域 Controller : 'There is already scopedTarget bean method.'

标签 java session spring-mvc spring-annotations

我正在使用 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 将 visualizationPropertiesscopedTarget.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/

相关文章:

hibernate - JBoss 7 Spring JPA + Hibernate 应用程序 : no transaction is in progress

java执行批处理文件

java - 继承问题/问题

java - 如何从android中的Edittext连续获取值

session - Magento Memcached session

java - 网络服务器中的 session

AJAX 从 Spring-MVC Controller 获取数据

java - 您如何配置 Spring MVC @PathVariables 以接受包含破折号的字符串?

java - 我应该如何为游戏实现等待通知方法?

java - 线程同步——同步块(synchronized block)