JSF - 类“packageName.DonacionBean”没有属性“donar” - 未检测到操作方法?

问题描述 投票:0回答:1

我在一个使用 EJB 和 JSF 的 Java 项目中遇到了一个问题,这非常令人沮丧。我有一个简单的设置,其中 XHTML 文件调用托管 bean 中定义的方法。

这是我的.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>
    <title>Donaciones</title>
</head>
<body>
    <h:form id="donacionForm">
        <h2>Registrar una Donación</h2>
        <p:panelGrid columns="2" cellpadding="5">
            <h:outputLabel for="monto" value="Monto:" />
            <p:inputText id="monto" value="#{donacionBean.monto}" required="true"/>

            <h:outputLabel for="dia" value="Día:" />
            <p:selectOneMenu id="dia" value="#{donacionBean.dia}">
                <f:selectItems value="#{donacionBean.dias}" />
            </p:selectOneMenu>

            <h:outputLabel for="mes" value="Mes:" />
            <p:selectOneMenu id="mes" value="#{donacionBean.mes}">
                <f:selectItems value="#{donacionBean.meses}" />
            </p:selectOneMenu>

            <h:outputLabel for="anio" value="Año:" />
            <p:inputText id="anio" value="#{donacionBean.anio}" required="true"/>

            <h:outputLabel for="moneda" value="Moneda:" />
            <p:selectOneMenu id="moneda" value="#{donacionBean.moneda}">
                <f:selectItem itemLabel="USD" itemValue="USD" />
                <f:selectItem itemLabel="UYU" itemValue="UYU" />
            </p:selectOneMenu>
        </p:panelGrid>
        <p:commandButton value="Agregar Donación" action="#{donacionBean.donar}" update=":donacionForm:donaciones"/>     
                    
        <h2>Lista de Donaciones</h2>
        <p:dataTable value="#{donacionBean.donaciones}" var="donacion">
            <p:column headerText="Monto">
                <h:outputText value="#{donacion.monto}" />
            </p:column>
            <p:column headerText="Moneda">
                <h:outputText value="#{donacion.moneda}" />
            </p:column>
            <p:column headerText="Fecha">
                <h:outputText value="#{donacion.fecha.dia}/#{donacion.fecha.mes}/#{donacion.fecha.anio}" />
            </p:column>
        </p:dataTable>
    </h:form>
</body>
</html>

这是相应的托管 bean,DonacionBean.java:

package packageName;

import jakarta.ejb.EJB;
import jakarta.enterprise.context.RequestScoped;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Named;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Named("donacionBean")
@RequestScoped 
public class DonacionBean {
    
    public DonacionBean() {
        dias = new ArrayList<>();
        meses = new ArrayList<>();
        
        for (int i = 1; i <= 31; i++) 
            dias.add(i);
        for (int i = 1; i <= 12; i++) 
            meses.add(i);
        
    }
    
    private int monto;
    private int dia;
    private int mes;
    private int anio;
    private String moneda;
    private List<Integer> dias;
    List<Integer> meses;
    private Set<DTDonacion> donaciones;
    
    @EJB
    private packageName.DonacionServiceRemote donacionService;

    public String donar() {
        try {
            DTFecha fecha = new DTFecha(dia, mes, anio);
            TipoMoneda tipoMoneda = TipoMoneda.valueOf(moneda.toUpperCase());
            Donacion donacion = new Donacion(monto, fecha, tipoMoneda);

            donacionService.agregarDonacion(donacion);

            // Mensaje de éxito en la interfaz
            FacesContext.getCurrentInstance().addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_INFO, "Donación agregada exitosamente", null));
            
            // Resetear campos después de agregar
            monto = 0;
            dia = 1;
            mes = 1;
            anio = 0;
            moneda = null;

            return "result";
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, 
                new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al agregar donación: " + e.getMessage(), null));
            return "result";
        }
    }

    public List<Integer> getDias() {
        return dias;
    }

    public List<Integer> getMeses() {
        return meses;
    }
    
    public Set<DTDonacion> getDonaciones() {
        this.donaciones = donacionService.obtenerDonaciones();
        return donaciones;
    }

    // Getters y setters para los campos de entrada
    public int getMonto() {
        return monto;
    }

    public void setMonto(int monto) {
        this.monto = monto;
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public String getMoneda() {
        return moneda;
    }

    public void setMoneda(String moneda) {
        this.moneda = moneda;
    }
    
}

但是,当我尝试通过浏览器访问XHTML页面时,出现以下错误:

An Error Occurred:
/pages/donacion.xhtml: The class 'packageName.DonacionBean' does not have the property 'getDonar'.

这让我发疯。有趣的是,如果我将方法 donar 重命名为 getDonar,错误就会消失,但当然,逻辑不会按预期工作。

关于为什么 DonacionBean 中的方法 donar 会导致这个问题有什么想法吗?我正在使用 Eclipse 和 Wildfly,如果有帮助的话。

我什至在同一个项目中尝试了类似的示例,它工作得很好:

这是 UserBean.java 的工作示例:

package packageName;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;

@Named("userBean")
@RequestScoped
public class UserBean {
    private String name;
    private String email;

    public UserBean() {
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    // Action method
    public String submit() {
        System.out.println("Name: " + name);
        System.out.println("Email: " + email);
        return "result";
    }
}

及其对应的user.xhtml:


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>User form</title>
</h:head>
<h:body>
    <h:form>
        <h:panelGrid columns="2">
            <h:outputLabel value="Name:" for="name" />
            <h:inputText id="name" value="#{userBean.name}" />

            <h:outputLabel value="Email:" for="email" />
            <h:inputText id="email" value="#{userBean.email}" />

            <h:commandButton value="Send" action="#{userBean.submit}" />
        </h:panelGrid>
    </h:form>
</h:body>
</html> 

结果.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Result</title>
</h:head>
<h:body>
    <h1>Thanks!</h1>
    <h:outputText value="Name: #{userBean.name}" />
    <br />
    <h:outputText value="Email: #{userBean.email}" />
</h:body>
</html>

操作方法调用没有任何问题。

谢谢!

java jsf xhtml ejb wildfly
1个回答
0
投票

JSF 发生的问题是通过采取行动方法进行解决的。解析器:

坎比亚

action="#{donacionBean.donar}" por actionListener="#{donacionBean.donar}" 

en el archive.xhtml.

Ejemplo:

<p:commandButton value="Agregar Donación" actionListener="#{donacionBean.donar}" update=":donacionForm:donaciones"/>

Asegúrate de que lafirma del método donar() es Correcta y nocesita cambios adicionales.

为了调整,JSF 调用正确的操作方法。

© www.soinside.com 2019 - 2024. All rights reserved.