Spring请求Scoped Beans由Factory初始化

时间:2013-12-01 17:08:27

标签: spring

我在尝试的示例应用中创建请求范围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>

我仍然收到相同的错误消息。

1 个答案:

答案 0 :(得分:3)

您的代码有2个问题

  1. 您正在实施FactoryBean并正在添加注释,基本上混合策略(一般来说)不是一个好主意
  2. HttpServletRequest注入单个对象。
  3. 要解决这些问题,请删除FactoryBean接口,该接口优先使用@Bean带注释的方法。您现在还可以删除isSingletongetObjectType方法,因为这些方法不需要。

    第二个问题是只需删除@Autowired属性,只需将其作为方法参数添加到getObject方法即可。