2016-07-05 11 views
0

私の使用方法では、時々私はbean MyNullableを持っていますが、時にはOKです。問題は、このクラスを使用するBeanを作成したいときです(常にではなく、nullを受け入れます)。nullパラメータを持つ@Beanメソッド

クラスのbeanを提供しない場合MyNullable私はエラーが発生します(依存性は見つかりません)。何とかこのパラメータにrequired = falseのようなsmthingを付けて@Autowiredのリンクに注釈を付けることはできますか?

@Bean 
@Scope(SCOPE_PROTOTYPE) 
public SynchronousRpcProxy myBean(MyObj1 notNull1, MyObj2 notNull2, MyNullable canBeNull) { 
    assert notNull1 != null; 
    assert notNull2 != null; 
    // assert canBeNull!= null; // this is not true because canBeNull can be null 
    return new SmthFromExternalLib(notNull1, notNull2, canBeNull); // do staff 
} 

答えて

2

は、Java 8を使用している場合は、このためにOptionalを使用することができます。

@Bean 
@Scope(SCOPE_PROTOTYPE) 
public SynchronousRpcProxy myBean(MyObj1 notNull1, MyObj2 notNull2, 
            Optional<MyNullable> canBeNull) { 
    return new SmthFromExternalLib(notNull1, notNull2, canBeNull.orElse(null)); 
} 

あなたがこれを行うと、何MyNullable Beanが存在しない場合canBeNull.orElse(null)戻りnullように、Optionalは、空になります。

は、Java 8を使用していない場合は、オプションの依存関係としてMyNullableを持つ工場Beanを作成することができます。

@Component 
public class SynchronousRpcProxyFactory 
       implements FactoryBean<SynchronousRpcProxy> { 

    @Autowired 
    private MyObj1 notNull1; 

    @Autowired 
    private MyObj1 notNull2; 

    @Autowired(required = false) 
    private MyNullable canBeNull; 

    @Override 
    public SynchronousRpcProxy getObject() throws Exception { 
     return new SynchronousRpcProxy(notNull1, notNull2, canBeNull); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return SynchronousRpcProxy.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return false; 
    } 
} 
+0

Nope、Java 7が搭載されています。 – MAGx2

+0

@ MAGx2 Java 8を使用していない場合は編集を参照してください。 – Jesper

+0

は '' 'isSingleton'''がfalseになるべきではありませんか?私の例では、プロトタイプがあります。 – MAGx2

1

あなたが代わりにファクトリメソッド

に注入するの構成クラスで使用するフィールドを試すことができます
@Autowired(required=false) 
MyNullable canBeNull; 
関連する問題