0

私のアプリケーションでは、「リード」の電子メール アドレスを編集するための一連のフォームを作成します。

各フォームのフィールドはプログラムによって追加され、それぞれがリードの ID に基づいて一意の ID を取得します。x 個のリードがあるため、このメソッドを呼び出して各リードをビューに追加します。

    public void addLead(HtmlPanelGrid grid, Lead lead, String beanName){
    updatedEmails.put(lead.getGuid(), lead.getEmail());
    wasAdded.put(lead.getGuid(), false);
    form = (HtmlForm)getApplication().createComponent(HtmlForm.COMPONENT_TYPE);
    form.setId("form"+lead.getGuid());
    grid.getChildren().add(form);

    HtmlOutputLabel label = (HtmlOutputLabel)getApplication().createComponent(HtmlOutputLabel.COMPONENT_TYPE);
    label.setId("ID"+lead.getGuid());
    label.setValue("Name: " + lead.getFirstName() +" " + lead.getLastName()+" Email: ");
    label.setStyleClass("hs-form label");
    form.getChildren().add(label);

    HtmlInputText inputText = (HtmlInputText)getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
    inputText.setId("input"+lead.getGuid());
    String binding = "#{" + beanName + "." + "updatedEmails[\""+lead.getGuid()+"\"]}";
    ValueExpression ve = getExpressionFactory().createValueExpression(getELContext(), binding, String.class);
    inputText.setValueExpression("value", ve);
    inputText.setStyleClass("hs-input");
    form.getChildren().add(inputText);

    HtmlCommandButton cmdButton = (HtmlCommandButton)getApplication().createComponent(HtmlCommandButton.COMPONENT_TYPE);
    cmdButton.setId("edit"+lead.getGuid());
    System.out.println("making edit button:" +lead.getGuid());
    String binding2  = "#{" + beanName + "." + "editEmail(\"" + lead.getGuid() + "\")}";
    System.err.println("binding:"+binding2);
    Class[] classList = new Class[1];
    classList[0] = String.class;
    MethodExpression ve2 = getExpressionFactory().createMethodExpression(getELContext(), binding2, null, classList);
    cmdButton.setActionExpression(ve2);
    cmdButton.setValue("Edit Email");
    cmdButton.setStyleClass("hs-button primary");
    System.out.println(cmdButton.toString());
    form.getChildren().add(cmdButton);

    HtmlCommandButton delButton = (HtmlCommandButton)getApplication().createComponent(HtmlCommandButton.COMPONENT_TYPE);
    delButton.setId("del"+lead.getGuid());
    String delBinding = "#{" + beanName + "." + "delLead(\"" + lead.getGuid() + "\")}";
    MethodExpression ve3 = getExpressionFactory().createMethodExpression(getELContext(), delBinding, null, classList);
    delButton.setActionExpression(ve3);
    delButton.setValue("Delete this Lead");
    delButton.setStyleClass("hs-button orange");
    form.getChildren().add(delButton);


}

私が抱えている問題は、editEmail メソッドが呼び出されると、呼び出しが編集のために API に送信され、成功を確認する別の JSF コンポーネントがビューに追加されることです。これは初めてうまくいきます。問題は、その後、他の編集ボタンを押して editEmail をもう一度呼び出すと、新しい成功コンポーネントと最初のコンポーネントを再度追加しようとすることです。同じ ID を持っているため、これはもちろんエラーをスローします。これが editEmail メソッドです。

public void editEmail(String guid){
    System.out.println("Edit Email Called: "+guid);
    leadToEdit = leads.get(guid);
    leadToEdit.setEmail(updatedEmails.get(guid));
    System.out.println(leads.get(guid).getEmail());
    try {
        URL url;
        if(useOAuth){
            url = new URL("https://api.hubapi.com/leads/v1/lead/" + guid + "?access_token=" + portal.getOauthToken());
        }
        else
            url = new URL("https://api.hubapi.com/leads/v1/lead/"+guid+"?portalId="+portal.getPortalID()+"&hapikey="+portal.getApiKey());
        System.out.println(url.toString());
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        String request = "{\"email\":\""+leads.get(guid).getEmail()+"\"}";
        System.out.println(request);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestMethod("PUT");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setUseCaches(false);

        DataOutputStream osw = new DataOutputStream(conn.getOutputStream());
        osw.writeBytes(request);
        osw.flush();

        System.err.println(conn.getResponseCode());
        if(conn.getResponseCode()<300)
        {
            UIViewRoot ui = FacesContext.getCurrentInstance().getViewRoot();
            HtmlForm form = (HtmlForm)ui.findComponent("mainForm:form"+leadToEdit.getGuid());
            final HtmlOutputText output = (HtmlOutputText)getApplication().createComponent(HtmlOutputText.COMPONENT_TYPE);
            output.setId("output"+leadToEdit.getGuid());
            output.setValue("Edit Success");
            output.setStyleClass("hs-block-message success");
            form.getChildren().add(output);
        }
        else{
            UIViewRoot ui = FacesContext.getCurrentInstance().getViewRoot();
            HtmlForm form = (HtmlForm)ui.findComponent("mainForm:form"+leadToEdit.getGuid());
            final HtmlOutputText output = (HtmlOutputText)getApplication().createComponent(HtmlOutputText.COMPONENT_TYPE);
            output.setId("output"+leadToEdit.getGuid());
            output.setValue("Edit Failure");
            output.setStyleClass("hs-block-message error");
            form.getChildren().add(output);
        }

        } 
    catch (Exception ex) {
        Logger.getLogger(PortalView.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Bean がセッションスコープであるためでしょうか?

すべてのコンポーネントを保持する PanelGrid が作成されると、ここで addLead が呼び出されます。

    public HtmlPanelGrid getMainGrid(){
    if(mainGrid==null){
        mainGrid = (HtmlPanelGrid)getApplication().createComponent(HtmlPanelGrid.COMPONENT_TYPE);
        mainGrid.setId("grid");
        for(Lead lead : leadArray){
            addLead(mainGrid, lead, "PortalView");
        }
    }
    return mainGrid;
}
4

0 に答える 0