2012-02-15 5 views
0

솔기 구성 요소를 다른 구성 요소에 주입하려고합니다. 자동으로 구성합니다. 그러나 어떤 이유로 주입 된 솔기 구성 요소가 NPE를 던집니다.Seam AutoCreate가 작동하지 않습니까?

XHTML

    <a4j:commandLink id="cbrModal" 
            action="#{detailAction.showInformation(1L)}" 
            reRender="DetailModal" 
            limitToList="true"> 
         <h:outputText value="text"/> 

        </a4j:commandLink> 

DetailActionBean.java

@Name("detailAction") 
public class DetailActionBean implements Serializable { 

    @In(create = true, required = false) 
    @Out(required = false) 
    private RulesValidator rulesValidator; 

    public void showInformation(long id) { 

       rulesValidator.setCheckCount(0); // rulesValidator == null here and throws npe 

    } 
) 

RulesValidator.java

@AutoCreate 
@Name("rulesValidator") 
@Scope(ScopeType.SESSION) 
public class RulesValidator implements Serializable { 

    private int checkCount = 0; 
    public void setCheckCount(int checkCount) { 
     this.checkCount = checkCount; 
    } 


} 

답변

1

Seam은 기본 패키지를 검색하고 @Name 구성 요소를 찾은 다음 해당 구성 요소는 자동 배선 가능합니다. seam.properties 파일 (비어 있음)을 seam이 스캔 할 기본 패키지를 알 수 있도록 지정해야합니다. dint에서 작업중인 모듈에는 seam.properties가 있으므로 RulesValidator가 검색 중이 아니며 이음매 구성 요소로 처리되었습니다. 따라서 자동 생성 dint 작업.

1

필수 거짓 수단 정확히합니다. 아직 존재하지 않는 경우 생성되지 않으므로 확인해야합니다. Autocreate는 in 주석에 create true를 정의 할 필요가 없다는 것을 의미합니다.

설명 업데이트 : 예이 주석이 presemt 인 경우 seam이 삽입시 구성 요소를 자동 작성합니다. 그러나 주사를 맞출 필요는 없다고 명시합니다. 왜 솔기가 아무것도하지 않는지. @In의 모든 속성을 제거하면 제대로 작동합니다. 기본값은 원하는 것입니다.

+0

Seam docs, AutoCreate @In에서 create = true를 지정하지 않아도 요청할 때마다이 구성 요소를 자동으로 인스턴스화해야 함을 지정합니다. 당신은'@Create가 필요하다는 것을 의미합니까? public void init() { rulesValidator = new rulesValidator(); }'이 작업을 수행하면 rulesValidator 인스턴스 변수가 호출 될 때마다 초기화됩니다. –

+0

명확히하기 위해, 나는'rulesValidator.setCheckCount (0);'을 실행하기를 원합니다. NPE 체크를하면 호출을 무시할 것입니다. –