gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:33:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com