程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”?

开发过程中遇到Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”的问题如何解决?下面主要结合日常开发的经验,给出你关于Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”的解决方法建议,希望对你解决Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”有所启发或帮助;

这里的问题有两个方面。首先,您要注释一个已经用注释过的类@Controller

@Controller
@Scope(value="session", proxymode=ScopedProxymode.TARGET_CLASS)
public class VisualizationPropertIEs {

其次,您正在使用作用域代理。在这种情况下,Spring将注册两个bean定义。一个带有visualizationPropertIEs实际bean的名称scopedTarget.visualizationPropertIEs,另一个带有将用作factorybean创建代理的名称。

处理程序方法注册过程(针对@ControllerBean和@requestMapPing方法)是通过在上下文中查找所有Bean ,查找其类型,扫描该类型的方法并在用注释的方式注册这些方法来工作的@requestMapPing

由于Spring将bean名称visualizationPropertIEsscopedTarget.visualizationPropertIEsbean名称都解析为VisualizationPropertIEs具有@requestMapPing注释方法的bean类型,因此它将尝试同时注册两者,由于映射冲突(第二个处理程序不能映射到同一请求)而导致第二次失败。

我建议的解决方案是重构并创建一个专用@Controller类(未代理),该类委派给会话范围的VisualizationPropertIEsbean。

解决方法

我正在使用Spring MVC创建一个可视化编辑器Web应用程序。

可视化具有一些属性:

public class VisualizationProperties {
    double strokeWidth = 1;
    Rectangle SELEctedArea;
}

每个浏览器会话都应该有一个会话,因此我将其定义为一个会话范围的bean:

@Component
@Scope("session")
public class VisualizationProperties {
    ...

由于我想从服务访问它&Hellip;

@@R_874_9260@ce
public class Visualization@R_874_9260@ce {

    @resource
    private VisualizationProperties properties;

    public void createVisualization () {
        //create visualization using properties
        ...
    }
}

&Hellip;我通过代理定义访问权限:

@Component
@Scope(value="session",proxymode=ScopedProxymode.TARGET_CLASS)
public class VisualizationProperties {
    ...

将成员设为私有并向其添加getters + setters。

到目前为止完美。

现在,我希望客户端能够读取和更新属性。

因此,我将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.

这是为什么?

大佬总结

以上是大佬教程为你收集整理的Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”全部内容,希望文章能够帮你解决Spring MVC,使用基于类的代理的作用域控制器:“已经有scopedTarget bean方法。”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。