我在一个使用 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>
操作方法调用没有任何问题。
谢谢!
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 调用正确的操作方法。