2012-11-25 16 views
10

È possibile autorizzare un bean con scope richiesta in un bean con ambito applicazione. cioèAutowiring richiesta di scope con scope nei bean con ambito applicativo

Ho una classe RequestScopedBean:

class RequestScopedBean { 
    .... 
    .... 
    .... 
} 

e una classe Application ambito fagiolo in cui la richiesta ambito fagiolo è autowired.

class ApplicationScopedBean { 
    @Autowire 
    private RequestScopedBean requestScopedBean; 
    .... 
    .... 
    .... 
} 

e xml primavera-config è la seguente:

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation=" 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
"> 
<bean id="applicationScopedBeans" class="ApplicationScopedBean" /> 
<bean id="requestScopedBean" class="RequestScopedBean" scope="request"> 
</bean> 
</beans> 

quando provo a fare funzionare questa applicazione la creazione di fagioli di applicationScopedBean non riesce con il seguente errore:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ApplicationScopedBean': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not  autowire field: private RequestScopedBean requestScopedBean; nested exception is java.lang.IllegalStateException: No Scope registered for scope 'request' 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075) 
    at com.amazon.coral.reflect.instantiate.SpringInstantiatorFactory$1.newInstance(SpringInstantiatorFactory.java:168) 
    ... 19 more 

risposta

8

Il l'eccezione sopra suggerisce che non è stato configurato correttamente Spring per la fornitura di bean con scope richiesta.

È necessario aggiungere questo al vostro web.xml come descritto nella documentazione here:

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

Tuttavia, non v'è più alla sua domanda di un semplice configurazione. Stai tentando di iniettare un bean con scope richiesta in un bean con ambito singleton. Spring risolve le dipendenze e crea un'istanza dei singleton all'avvio del contenitore DI. Ciò significa che ApplicationScopedBean verrà creato una sola volta (a questo punto non ci sarà alcuna richiesta in volo e quindi l'autowiring probabilmente fallirà).

Se si stesse utilizzando un bean con scope prototipo invece di scope scope, si dovrebbe considerare un modo di fornire una nuova istanza al bean con scope singleton ogni volta che viene utilizzato. Gli approcci per questo sono descritti nel capitolo Method Injection dei documenti Spring.

16

È necessario contrassegnare il proprio requestScopedBean come proxy con scope, in questo modo Spring verrà iniettato in un proxy per requestScopedBean e in background gestirà l'ambito in modo appropriato.

<bean id="requestScopedBean" class="RequestScopedBean" scope="request"> 
    <aop:scoped-proxy/> 
</bean> 

Più here

Problemi correlati