2016-07-05 3 views
0

가끔 내 콩을 가지고 있는데, 콩밥 MyNullable 가끔은 괜찮습니다. 문제는이 클래스를 사용하는 bean을 생성하고자 할 때입니다. (항상 아니지만 null을 수락합니다).null 매개 변수가있는 @Bean 메소드

콩을 제공하지 않으면 아래 코드에서

오류가 발생합니다 (종속성을 찾을 수 없음). 어떻게 든이 매개 변수에 required = false 링크 (@Autowired에 링크)와 같은 주석을 달 수 있습니까? 자바 (8)을 사용하는 경우

@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

이에 대한 Optional을 사용할 수 있습니다 :이 작업을 수행하고 더 MyNullable 콩이없는 경우

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

에서, Optional이 비어있을 것 canBeNull.orElse(null) 반환 null 때문에. 자바 (8)를 사용하지 않는 경우

, 선택 사양 인 종속성으로 MyNullable이있는 공장 빈 만들 수 있습니다 : 당신은 구성 클래스에 사용 필드를 시도하는 대신 팩토리 메소드에 주입 할 수

@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; 
관련 문제