当前位置: 首页 > 知识库问答 >
问题:

Spring MVC,使用基于类的代理的作用域控制器:“已经存在ScopedTargetbean方法。”

向嘉誉
2023-03-14

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

visualizaton有一些属性:

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 {
    ...

将成员设为私有并向其添加getters 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;
    }

}

导致启动时出现以下异常:

非法状态异常:找到不明确的映射

无法将'Visual alizationProperties'bean方法getProperties()映射到{[/Properties],方法=[GET],...}:

这里已经有了arget.visualization属性的bean方法。

为什么会这样?

共有1个答案

公德明
2023-03-14

这里的问题有两个方面。首先,您要注释一个已经用控制器注释的类。

@Controller
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class VisualizationProperties {

其次,您正在使用作用域代理。在这种情况下,Spring将注册两个bean定义。一个名称为实际bean的visualizationProperties,另一个名称为scopedTarget。visualizationProperties将充当创建代理的FactoryBean。

处理程序方法注册过程(对于@Controllerbean和@Request estMap方法)的工作原理是查找上下文中的所有bean名称、查找它们的类型、扫描该类型的方法并注册这些方法,如果它们用@Request estMap注释的话。

由于Spring解析可视化属性范围Target.visualization属性bean名称为VisualizationProperties类型的bean,具有@Request estMap注释方法,它将尝试注册两者,第二次失败是因为映射冲突(您不能将两个处理程序映射到同一个请求)。

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

 类似资料:
  • 问题内容: 我试图通过使用变量在第一控制器中调用第二控制器的方法。这是我的第一个控制器中的一种方法: 我可以设置的值,但是由于某种原因我不能打电话。控制台显示此错误: TypeError:对象#没有方法’getMainCategories’ 有没有一种方法可以调用上述方法? 编辑: 我使用以下方法同时加载两个应用程序。 我肯定可以在这里使用服务,但我想知道是否还有其他选择可以这样做! 问题答案:

  • 更新Spring Boot 2.3后。0.0版本到2.3版本。1.发布后,domian类转换在控制器方法内停止工作。 这是参考控制器,它在SpringBoot2.3之前工作得非常好。0.1释放 在2.3中。1.RELEASE,当我发出以下请求时,我得到以下错误 2020-06-17 13:07:12.780WARN 574637 --- [ XNIO-1任务-3]. w. s. m. s.Defa

  • 我想处理的情况下401,403,500等只是状态代码应该返回而不是视图。

  • 问题内容: 我在子模块中有一些基于注释的控制器。这些模块被部署为jar文件。 jar文件中基于注释的控制器未加载到spring配置。 我正在使用eclipse中的导出实用程序手动导出jar文件。 有没有人遇到过这个问题? 问题答案: 使用eclipse中的导出实用程序导出jar文件时,有一个选项称为添加目录项。选中此选项并导出jar文件,这将解决问题。

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • 我试图使用apache kafka二进制文件中的kafka控制台生成器生成消息,并在spring boot中使用消费者设置。消费者使用avro模式。 当消息以json格式生成时,我的消费者抛出异常-“无法序列化”。 我找到了一个解决方案,可以使用“ConFluent Platform 7.1”,它有kafka-avro-console-生产者。它支持avro,但它是企业版。 有没有一种方法可以使用