我在尝试的示例应用中创建请求范围bean时遇到问题。我使用的代码如下
Site.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'创建范围代理:Target 代理创建时无法确定类型。
指出我做错了什么。
我尝试在SiteImpl上设置@Component和@Scoped注释,但是后来没有调用工厂来初始化它
我也尝试删除@Scope,@ Component和@Bean注释,而是依赖于XML配置
<bean id="site" factory-bean="siteFactory" scope="request">
<aop:scoped-proxy proxy-target-class="false"/>
</bean>
我仍然收到相同的错误消息。
答案 0 :(得分:3)
您的代码有2个问题
FactoryBean
并正在添加注释,基本上混合策略(一般来说)不是一个好主意HttpServletRequest
注入单个对象。要解决这些问题,请删除FactoryBean
接口,该接口优先使用@Bean
带注释的方法。您现在还可以删除isSingleton
和getObjectType
方法,因为这些方法不需要。
第二个问题是只需删除@Autowired
属性,只需将其作为方法参数添加到getObject
方法即可。