2013-05-15 10 views
7

Czy jest jakiś sposób, aby uczynić @Resource opcjonalnym? Oznacza to, że jeśli nie mam fasoli typu żądanej przez @Resource, nie otrzymam wyjątku, ale zostanie on ustawiony na wartość null.W jaki sposób czynisz @Resource opcjonalnym?

+0

zobacz tutaj http://stackoverflow.com/questions/3957430/optional-spring-bean-references.To może ci pomóc – PSR

+0

ok wygląda na to, że nie jest to możliwe. Musiał użyć @Autowired (required = false). Nie to, czego dokładnie chciałem, ale to zrobi – MrProper

Odpowiedz

2

OK wygląda na to, że nie jest możliwe. Musiał użyć @Autowired (required = false). Nie to, czego dokładnie chciałem, ale to zrobi.

+0

To sprawia, że ​​zasób jest opcjonalny, więc jest to, co chcesz zrobić, nawet jeśli tego nie wiesz :) –

+1

Autowired i Resource to dwie różne rzeczy, spróbuj wstrzyknąć z Autowired - będzie działać tylko dla ziaren, ale nie dla zasobów –

+0

@DanubianSailor - '@ Autowired' jest adnotacją wiosenną, a' @ Resource' jest typową adnotacją Java. Jeśli nie używasz Springa, opcja '@ Autowired' nie byłaby nawet opcją. –

0

Powinieneś być w stanie użyć fasoli zwyczaj fabryki do osiągnięcia tego celu:

public class OptionalFactoryBean<T> implements BeanFactoryAware, FactoryBean<T> { 

    private String beanName; 

    public void setBeanName(String beanName) { 
     this.beanName = beanName; 
    } 

    @Override 
    public T getObject() throws Exception { 
     T result; 
     try { 
      result = beanFactory.getBean(beanName); 
     } catch (NoSuchBeanDefinitionException ex) { 
      result = null; 
     } 
     return result; 
    } 

    private BeanFactory beanFactory; 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) { 
     this.beanFactory = beanFactory; 
    } 

    private Class<?> objectType = Object.class; 

    public void setObjectType(Class<?> objectType) { 
     this.objectType = objectType != null? objectType : Object.class; 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return objectType; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    }  
} 

konfiguracja Wiosna dla opcjonalnej fasoli byłoby:

<bean id="myBean" class="mypackage.OptionalFactoryBean" scope="singleton"> 
    <property name="beanName" value="myRealBean"/> 
    <property name="objectType" value="mypackage.MyRealBean"/> 
</bean> 

A co można uzyskać null wstrzykiwany. Następnie możesz zdefiniować:

<bean id="myRealBean" class="mypackage.MyRealBean" ...> 
    <!-- .... --> 
</bean> 

jeśli chcesz wstrzyknąć konkretny komponent.

Powiązane problemy