【问题标题】:Spring Request Scoped Beans initialized by Factory由 Factory 初始化的 Spring Request Scoped Bean
【发布时间】: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


【解决方案1】:

您的代码有 2 个问题

  1. 您正在实施 FactoryBean 并添加注释,基本上是混合策略,这(一般来说)不是一个好主意
  2. HttpServletRequest 注入到单例对象中。

要解决这些问题,请删除 FactoryBean 接口,该接口将优先于您的 @Bean 注释方法。您现在还可以删除不需要的 isSingletongetObjectType 方法。

第二个问题是简单地删除@Autowired 属性并将其作为方法参数添加到您的getObject 方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多