【发布时间】:2013-12-01 17:08:26
【问题描述】:
我在尝试在示例应用程序中创建请求范围的 bean 时遇到问题。我使用的代码如下
网站.java
public interface Site {
int getId();
String getCode();
String getName();
}
SiteImpl.java
public class SiteImpl implements Site {
private int id;
private String code;
private String name;
public SiteImpl(int id, String name, String code) {
this.id = id;
this.name = name;
this.code = code;
}
public int getId() {
return id;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
最后是 SiteFactory.java
@Service
public class SiteFactory implements FactoryBean<SiteImpl> {
@Autowired
private HttpServletRequest currentRequest;
@Override
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public SiteImpl getObject() throws Exception {
SiteImpl site = null;
if (currentRequest != null) {
site = new SiteImpl(1, currentRequest.getServerName(), currentRequest.getServerName());
}
return site;
}
@Override
public Class<?> getObjectType() {
return SiteImpl.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
我不断收到以下错误
无法为 bean 'scopedTarget.getObject' 创建范围代理:目标 创建代理时无法确定类型。
任何指向我做错了什么的指针。
我尝试在 SiteImpl 上设置 @Component 和 @Scoped 注释,但是没有调用工厂对其进行初始化
我也尝试删除@Scope、@Component 和@Bean 注解,改为依赖 XML 配置
<bean id="site" factory-bean="siteFactory" scope="request">
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
我仍然收到相同的错误消息。
【问题讨论】:
-
发布完整的堆栈跟踪。混合注释和弹簧标记界面的第一件事都是以不同的方式处理,基本上这是等待发生的麻烦。尝试删除
FactoryBean接口。另外,不要注入HttpServletRequest(只会发生一次或根本不会发生)将其作为参数移动到getObject方法(在删除接口之后)。 -
您只能将(Autowire)HttpServleRequest 注入到本身属于 REQUEST 范围的 bean 中。解决方法:
currentRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); -
@M.Deinum 您的解决方案对我有用。您能否将其发布为答案,以便我对其进行投票?谢谢
标签: spring