2017-11-20 48 views
0

이 SO 스레드에서 설명한 유사한 문제가 발생했습니다. Why does JSF null out a nested class successfully instantiated in the backing bean? 중첩 된 객체가 여러 개인 객체와 각각의 속성을 생성하는 간단한 양식 (JSF-2.2)을 사용하고 있습니다. 인스턴스화가 성공적으로 수행되고 모든 객체와 그 자식이 null이 아닌 것을 볼 수는 있지만 어떤 이유로 양식을 제출할 때 전체 객체 트리가 다시 null로 설정됩니다. 아래의 예에서, 값 템플릿은제출시 JSF 중첩 된 객체가 null로 설정 됨

javax.el.PropertyNotFoundException 초래 : 대상 도달 할 수없는, '널' 가 null 돌아왔다.

왜냐하면 어떤 이유로 ArticleListConfiguration이 null로 설정되기 때문에 befor 제출이 발생합니다. 여기

그리고

<ui:composition template="../template/template.xhtml"> 
<ui:define name="content"> 
    <h:form id="createArticleListForm"> 
     <p:panel styleClass="content-panel"> 
      <h:panelGrid 
        columns="2" 
        styleClass="borderless-grid" 
        columnClasses="create-article-list-panel, create-article-list-panel"> 
       <p:panel 
         id="listValuesPanel"> 
        <p:inputText 
          id="articleListName" 
          value="#{createArticleListController.articleList.name}"/> 
        <p:inputText 
          id="articleListSize" 
          maxlength="3" 
          value="#{createArticleListController.articleListSize}"> 
        </p:inputText> 
        <p:selectBooleanCheckbox 
          id="saveArticleListConfigurationAsTemplate" 
          value="#{createArticleListController.articleList.articleListConfiguration.template}"/> 
        <h:panelGrid 
          columns="1"> 
         <p:fileUpload 
           id="upload" 
           widgetVar="fileUploadWidget" 
           fileUploadListener="#{createArticleListController.uploadImages}" 
           multiple="true" 
           onstart="submitSelection()" 
           oncomplete="handleMultiFileUploadRequest(PF('fileUploadWidget'));" 
           allowTypes="/(\.|\/)(jpg|png)$/" 
           styleClass="ui-widget"/> 
         <p:remoteCommand 
           name="submitSelection" 
           process="@this"/> 
        </h:panelGrid> 
       </p:panel> 
      </h:panelGrid> 
      <br/> 
      <p:commandButton 
        id="createArticleListButton" 
        process="@this @form" 
        value="#{contentController.getContent('createArticleList')}" 
        actionListener="#{createArticleListController.onCreate()}"/> 
     </p:panel> 
    </h:form> 
</ui:define> 

는 백업 빈

@ManagedBean 
@ViewScoped 
public class CreateArticleListController extends AbstractController { 

@Inject 
private ArticleListService articleListService; 

private ArticleList articleList; 
private Integer articleListSize; 
private List<Pair<String, InputStream>> files; 


@PostConstruct 
public void init() { 
    //The constructor of ArticleList creates and attaches instances of all necessary nested objects 
    articleList = new ArticleList(); 
    files = new ArrayList<>(); 
} 

public void onCreate() throws IOException { 
    articleListService.create(articleList, files); 
    navigateTo("articleListOverview"); 
} 

public void uploadImages(FileUploadEvent event) { 
    try { 
     files.add(Pair.of(event.getFile().getFileName(), event.getFile().getInputstream())); 
    } catch (IOException e) { 
     LOGGER.log(Level.ERROR, "Error uploading files"); 
     JsfMessageUtils.sendErrorMessageToUser("Error uploading files"); 
    } 
} 

public ArticleList getArticleList() { 
    return articleList; 
} 

public void setArticleList(ArticleList articleList) { 
    this.articleList = articleList; 
} 

public Integer getArticleListSize() { 
    return articleListSize; 
} 

}

답변

1

세터가 그것을 찾을 수 없습니다

private Integer articleListSize; 

p:inputText 누락되어에게 있습니다.

CreateArticleListController

public void setArticleListSize(Integer articleListSize) { 
    this.articleListSize = articleListSize; 
} 

를 추가합니다.

ArticleList 클래스 및 해당 하위 클래스에 참조 된 모든 getter 및 setter가 정의되어 있는지 확인하십시오.

UPDATE : 원래 XHTML 페이지를 확인 작업입니다

제작 한 컨트롤러

//... 
import javax.faces.bean.ViewScoped; 
//... 

@ManagedBean(name = "createArticleListController") 
@ViewScoped 
public class CreateArticleListController implements Serializable { 

    ArticleList articleList; 
    private Integer articleListSize; 

    @PostConstruct 
    public void init() { 
     System.out.println("On init controller"); 
     // initiliazing data 
     articleList = new ArticleList(); 
     articleList.setName("List 1"); 
     //if you omit following lines, you will get the same exception posted in your question 
     ArticleListConfiguration ac = new ArticleListConfiguration(); 
     ac.setTemplate(false); 
     articleList.setArticleListConfiguration(ac); 
    } 

    public ArticleList getArticleList() { 
     return articleList; 
    } 

    public void setArticleList(ArticleList articleList) { 
     this.articleList = articleList; 
    } 

    public Integer getArticleListSize() { 
     return articleListSize; 
    } 

    public void setArticleListSize(Integer articleListSize) { 
     this.articleListSize = articleListSize; 
    } 

    public void onCreate() throws IOException { 
     System.out.printf("On create -> Article name: %s, size: %s, template: %s\r\n", articleList.getName(), articleListSize, articleList.getArticleListConfiguration().isTemplate()); 
    } 

    public void uploadImages(FileUploadEvent event) { 
     System.out.println("On upload image " + event.getFile().getFileName()); 
    } 
} 

그래서 definitelly 초기화 ArticleList의 절차 또는 다른 물체에없는 무언가가되어 있어야합니다 . 내 예제 컨트롤러를 페이지와 함께 실행하고 작동하는지 확인하고 질문에 게시되지 않은 컨트롤러 부분으로 디버깅 범위를 좁히십시오.

+0

죄송합니다.이 설정기를 최소 작동 예제로 복사하는 것을 잊어 버렸습니다. 내 실제 컨트롤러는 조금 더 크고 그 세터를 확실히 포함합니다. 나는 또한 엔티티를 점검했다. 나는 실제로 인스턴스화가 빠졌지 만 그것을 추가해도 문제가 전혀 해결되지 않았습니다. 모든 아이디어를 어떻게 디버깅하는 것이 가장 좋습니까? – JohnPlata

+0

다른 아이디어가 없습니다. –

+0

xhtml 페이지에서 정상적으로 작동하는 컨트롤러로 답변을 업데이트했습니다. 확인 해봐. –