无法识别带有h:dataTable的JSF Facelet

时间:2018-08-03 10:41:22

标签: jsf-2.2 java-ee-7

我尝试熟悉JSF。我正在处理2014年以来的一本书。Facelet就像下面的

<f:view contracts="#{view.locale.language}">
        <ui:composition template="/template.xhtml">
            <ui:define name="content">
                <h1> Meine Aktion </h1>
                    <h:form>
                        <h:dataTable value="#campaignListProducer.campaigns}" var="campaign_">
                            <h:column>
                                <h:commandLink value="x" actionListener="{listCampaignsController.doDeleteCampaign(campaign_)}" />
                            </h:column>
                            <h:column>
                                <f:facet name="header">Name</f:facet>
                                <h:outputText value="#{campaign_.name}" />
                            </h:column>
                            <h:column>
                                <f:facet name="header">Spendenziel</f:facet>
                                <h:outputText value="#{campaign_.targetAmount}">
                                    <f:convertNumber type="currency" currencyCode="EUR" />
                                </h:outputText>
                            </h:column>
                            <h:column>
                                <f:facet name="header">Bisher gespendet</f:facet>
                                <h:outputText value="#{campaign_.amountDonatedSoFar}">
                                    <f.convertNumber type="currency" currencyCode="EUR" />
                                </h:outputText>
                            </h:column>
                            <h:column>
                                <h:commandLink value="Editieren" action="#{listCampaignsController.doEditCampaign(campaign_)}" />
                            </h:column>
                            <h:column>
                                <h:commandLink value="Spendenliste" action="#{listCampaignsController.doListDonation(campaign_)}" />
                            </h:column>
                            <h:column>
                                <h:commandLink value="Formular" action="#{listCampaignsController.doEditDonationForm(campaign_)}" />
                            </h:column>
                        </h:dataTable>
                        <h:commandButton value="Aktion hinzufügen" action="#{listCampaignscontroller.doAddCampaign}" />
                    </h:form>
                </ui:define>
            </ui:composition>
        </f:view>

campaign_变量将被识别为字符串。我的错误代码看起来像是 javax.servlet.ServletException: /listCampaigns.xhtml @17,52 value="#{campaign_.name}": The class 'java.lang.String' does not have the property 'name'.

广告系列类通常被编码为Bean。

public class Campaign implements Serializable{
private static final long serialVersionUID = -1828666L;
private String name;
private Double targetAmount;
private Double donationMinimum;
private Double amountDonatedSoFar;
private Account account;
private Long id;
private List<Donation> donations;

public Campaign(){
    account = new Account();
}

public String getName(){
    return name;
}

public void setName(String name){
    this.name = name;
}

public Double getTargetAmount(){
    return targetAmount;
}

public void setTargetAmount(Double targetAmount){
    this.targetAmount = targetAmount;
}

public Double getDonationMinimum(){
    return donationMinimum;
}

public void setDonationMinimum(Double donatinMinimum) {
    this.donationMinimum = donationMinimum;
}

public Double getAmountDonatedSoFar(){
    return amountDonatedSoFar;
}

public void setAmountDonatedSoFar(Double amountDonatedSoFar){
    this.amountDonatedSoFar = amountDonatedSoFar;
}

public Account getAccount(){
    return account;
}

public void setAccount(Account account){
    this.account = account;
}

public void setId(Long id){
    this.id = id;
}

public Long getId(){
    return id;
}

public List<Donation> getDonations(){
    return donations;
}

public void setDonations(List<Donation> donations){
    this.donations = donations;
}

}

CampaignListProducer类是一个实现为列表的模拟

public class CampaignListProducer implements Serializable {
private static final long serialVersionUID = -182866L;
private List<Campaign> campaigns;

public CampaignListProducer(){
    campaigns = createMockCampaigns();
}

public List<Campaign> getCampaigns(){
    return campaigns;
}

public List<Campaign> createMockCampaigns() {
    Donation donation1 = new Donation();
    donation1.setDonorName("Heinz Schmidt");
    donation1.setAmount(20d);
    donation1.setReceiptRequested(true);
    donation1.setStatus(Status.TRANSFERRED);
    donation1.setAccount(new Account(donation1.getDonorName(),"XXX Bank", "de456"));
    Donation donation2 = new Donation();
    donation2.setDonorName("Karl Meier");
    donation2.setAmount(30d);
    donation2.setReceiptRequested(false);
    donation2.setStatus(Status.IN_PROCESS);
    donation2.setAccount(new Account(donation1.getDonorName(),"YYY Bank", "de456"));
    List<Donation> spenden = new LinkedList<>();
    spenden.add(donation1);
    spenden.add(donation2);
    Campaign campaign1 = new Campaign();
    campaign1.setName("Trikots für A-Jugend");
    campaign1.setTargetAmount(1000d);
    campaign1.setAmountDonatedSoFar(258d);
    campaign1.setDonationMinimum(20d);
    campaign1.setId(1L);
    campaign1.setAccount(new Account("Max Mustermann", "ABC Bank", "de123"));
    campaign1.setDonations(spenden);
    Campaign campaign2 = new Campaign();
    campaign2.setName("Rollstuhl für Maria");
    campaign2.setTargetAmount(2500d);
    campaign2.setAmountDonatedSoFar(742d);
    campaign2.setDonationMinimum(25d);
    campaign2.setId(2L);
    campaign2.setAccount(campaign1.getAccount());
    campaign2.setDonations(spenden);
    List<Campaign> ret = new LinkedList<>();
    ret.add(campaign1);
    ret.add(campaign2);
    return ret;



}

}

我为CampaignListProducer放置了@SessionScoped和@Named注释

0 个答案:

没有答案