Ich arbeite an einer Anwendung mit Java EE, JPA, PrimeFaces, OmniFaces und PostreSQL.Interaktion einer Ansicht und einer Bean
Um mein Problem besser zu erklären, werde ich den Code von meinem Bean kopieren und aus der Sicht, die es verwaltet, dann werde ich meine Notwendigkeit aufdecken.
Ich habe den folgenden Code für eine Bean:
import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.util.Faces;
import com.mitocode.model.Config;
import com.mitocode.model.Contrato;
import com.mitocode.model.Persona;
import com.mitocode.model.Puesto;
import com.mitocode.service.IConfigService;
import com.mitocode.service.IContratoService;
import com.mitocode.service.IPersonaService;
import com.mitocode.service.IPuestoService;
import com.mitocode.util.MensajeManager;
@Named
@ViewScoped
public class ContratoFormBean implements Serializable{
@Inject
private Contrato contrato;
@Inject
private Persona persona;
@Inject
private Puesto puesto;
@Inject
private IPuestoService puestoService;
@Inject
private IPersonaService personaService;
@Inject
private IContratoService contratoService;
@Inject
private IConfigService configService;
private List<Persona> lstPersonas;
private List<Puesto> lstPuestos;
private double sueldo;
@PostConstruct
public void init() {
this.listarPersonas();
this.listarPuestos();
Contrato cont = (Contrato)Faces.getFlashAttribute("contrato");
if(cont != null){
this.leer(cont);
}else{
this.leerSueldoMinimo();
//this.obtenerSueldo();
}
}
public void leer(Contrato cont){
try {
contrato = contratoService.listarPorId(cont);
this.persona = contrato.getPersona();
this.puesto = contrato.getPuesto();
} catch (Exception e) {
MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR");
}
}
public void leerSueldoMinimo(){
try{
InputStream inputStream = ContratoFormBean.class.getClassLoader().getResourceAsStream("/parametros.properties");
Properties properties = new Properties();
properties.load(inputStream);
String parametro = properties.getProperty("sueldo_minimo");
Config conf = configService.leerParametro(parametro);
double salarioMinimo = conf.getValor() != null ? Double.parseDouble(conf.getValor()) : 0.0;
this.contrato.setSalario(salarioMinimo);
}catch(Exception e){
MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR");
}
}
public void listarPersonas() {
try {
lstPersonas = personaService.listar();
} catch (Exception e) {
MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR");
}
}
public void listarPuestos() {
try {
lstPuestos = puestoService.listar();
} catch (Exception e) {
MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR");
}
}
public void registrar() {
try {
contrato.setIdContrato(contratoService.getSiguientePK(persona));
contrato.setPersona(persona);
contrato.setPuesto(puesto);
contratoService.registrar(contrato);
} catch (Exception e) {
MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR");
}
}
public void obtenerSueldo(){
Puesto puesto = (Puesto)Faces.getFlashAttribute("puesto");
System.out.println(puesto.getSalarioBase());
if(puesto != null){
this.contrato.setSalario(puesto.getSalarioBase());
}else{
this.contrato.setSalario(0.0);
}
}
public Contrato getContrato() {
return contrato;
}
public void setContrato(Contrato contrato) {
this.contrato = contrato;
}
public Persona getPersona() {
return persona;
}
public void setPersona(Persona persona) {
this.persona = persona;
}
public Puesto getPuesto() {
return puesto;
}
public void setPuesto(Puesto puesto) {
this.puesto = puesto;
}
public List<Persona> getLstPersonas() {
return lstPersonas;
}
public void setLstPersonas(List<Persona> lstPersonas) {
this.lstPersonas = lstPersonas;
}
public List<Puesto> getLstPuestos() {
return lstPuestos;
}
public void setLstPuestos(List<Puesto> lstPuestos) {
this.lstPuestos = lstPuestos;
}
}
und die folgenden für die Ansicht, die die Bean verwalten:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<body>
<ui:composition template="/WEB-INF/templates/plantilla.xhtml">
<ui:define name="content">
<p:messages id="msj" showDetail="false" autoUpdate="true"
globalOnly="true" />
<h:form>
<h:panelGrid columns="4">
<p:outputLabel value="Persona" style="font-weight: bold;"/>
<p:selectOneMenu id="cboPersona" value="#{contratoFormBean.persona}" required="true" requiredMessage="Debe seleccionar una persona"
rendered="#{contratoFormBean.contrato.idContrato == 0}"
converter="omnifaces.SelectItemsConverter">
<f:selectItem itemLabel="--Seleccione--" itemValue="#{null}"
noSelectionOption="true" />
<f:selectItems value="#{contratoFormBean.lstPersonas}" var="per"
itemLabel="#{per.nombreCompleto}" itemValue="#{per}" />
</p:selectOneMenu>
<p:outputLabel value="#{contratoFormBean.persona.nombreCompleto}"
rendered="#{contratoFormBean.contrato.idContrato != 0}" />
<p:message for="cboPersona" />
<p:tooltip for="cboPersona" value="Elija una persona para el contrato"/>
<p:outputLabel value="Puesto" style="font-weight: bold;" />
<p:selectOneMenu id="cboPuesto" value="#{contratoFormBean.puesto}"
required="true" requiredMessage="Debe seleccionar un puesto de trabajo"
rendered="#{contratoFormBean.contrato.idContrato == 0}"
converter="omnifaces.SelectItemsConverter" oncomplete="#{contratoFormBean.obtenerSueldo()}">
<f:selectItem itemLabel="--Seleccione--" itemValue="#{null}"
noSelectionOption="true" />
<f:selectItems value="#{contratoFormBean.lstPuestos}" var="pue"
itemLabel="#{pue.nombre}" itemValue="#{pue}" />
</p:selectOneMenu>
<p:outputLabel value="#{contratoFormBean.puesto.nombre}"
rendered="#{contratoFormBean.contrato.idContrato != 0}" />
<p:message for="cboPuesto" />
<p:tooltip for="cboPuesto" value="Elija una puesto para la persona"/>
<p:outputLabel value="Fecha Inicio" style="font-weight: bold;"/>
<p:calendar id="txtFecha" value="#{contratoFormBean.contrato.fechaInicio}" required="true" requiredMessage="Debe indicar una fecha de inicio de contrato"
rendered="#{contratoFormBean.contrato.idContrato == 0}" locale="es" pattern="dd/MM/yyyy" mask="99/99/9999"/>
<p:outputLabel value="#{contratoFormBean.contrato.fechaInicio}"
rendered="#{contratoFormBean.contrato.idContrato != 0}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</p:outputLabel>
<p:message for="txtFecha" />
<p:tooltip for="txtFecha" value="Elija una fecha de inicio para el contrato"/>
<p:outputLabel value="Fecha Fin" style="font-weight: bold;"/>
<p:calendar id="txtFechaFin" value="#{contratoFormBean.contrato.fechaFin}" required="true" requiredMessage="Debe indicar una fecha de fin de contrato"
rendered="#{contratoFormBean.contrato.idContrato == 0}" locale="es" pattern="dd/MM/yyyy" mask="99/99/9999"/>
<p:outputLabel value="#{contratoFormBean.contrato.fechaFin}"
rendered="#{contratoFormBean.contrato.idContrato != 0}">
<f:convertDateTime pattern="dd/MM/yyyy" style="font-weight: bold;" />
</p:outputLabel>
<p:message for="txtFechaFin" />
<p:tooltip for="txtFechaFin" value="Elija una fecha de finalización para el contrato"/>
<p:outputLabel value="Salario" style="font-weight: bold;"/>
<p:spinner id="txtSalario" value="#{contratoFormBean.contrato.salario}" required="true" requiredMessage="El salario es obligatorio"
rendered="#{contratoFormBean.contrato.idContrato == 0}" min="#{contratoFormBean.contrato.salario}" validatorMessage="El monto debe ser mayor o igual al salario mínimo"/>
<p:outputLabel value="#{contratoFormBean.contrato.salario}"
rendered="#{contratoFormBean.contrato.idContrato != 0}">
<f:convertNumber currencySymbol="$" maxFractionDigits="2"
maxIntegerDigits="6" type="currency" />
</p:outputLabel>
<p:message for="txtSalario" />
<p:tooltip for="txtSalario" value="Ingrese un salario"/>
</h:panelGrid>
<p:commandButton value="Aceptar" update="@form"
rendered="#{contratoFormBean.contrato.idContrato eq 0}"
actionListener="#{contratoFormBean.registrar()}"
action="contrato?faces-redirect=true" />
<p:commandButton immediate="true" value="Cancelar" action="contrato?faces-redirect=true"
rendered="#{contratoFormBean.contrato.idContrato eq 0}"/>
<p:commandButton value="Aceptar" immediate="true"
action="contrato?faces-redirect=true"
rendered="#{contratoFormBean.contrato.idContrato != 0}" />
</h:form>
</ui:define>
</ui:composition>
Was ich brauche, ist, dass, wenn Sie wählen ein "Puesto" in der Combobox "cboPuesto" und können das Gehalt finden, das diesem "puesto" entspricht, und dass es als der Standardwert des Spinner mit ID erscheint. " txtSalario ".
Dafür hatte ich in Faces.getFlashAttribute ("puesto") mit der Absicht unterstützt, das ausgewählte Objekt ausgewählt und dann durch eine Service-Schicht das entsprechende Gehalt zu finden. Aber das Problem ist, dass es immer in Null kommt.
Ich entschied mich auch, das Ereignis "oncomplete" des cboPuesto zu verwenden, um die Methode namens "obtenerSueldo()" auszuführen, aber ich bekomme nicht, was ich brauche.
Ich appelliere an Sie, die mehr Erfahrung haben, um zu sehen, ob mir jemand eine Lösung geben kann.
Vielen Dank für Ihre Aufmerksamkeit.
TLDR; Bitte erstellen Sie eine vereinfachte Version Ihres Codes. Und deine Tags Tags sind zu breit. Die Interaktion zwischen View und Bean ist 'jsf' und nicht java oder jpa oder omnifaces (oder primefaces) – Kukeltje