2017-07-25 2 views
-1

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.

+0

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

Antwort

1

Unter der Annahme, dass Sie gerade kopiert und eingefügt den gesamten Code in die beiden Träger Bohne und xhtml

<p:selectOneMenu id="cboPuesto" value="#{contratoFormBean.puesto}" 
.... oncomplete="#{contratoFormBean.obtenerSueldo()}"> 

Hier werden Sie den gewählten Wert zu contratoFormBean.puesto aber für das Verfahren in der Backing Bean Zuweisung

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); 
} 

Sie holen den Wert von Flash, den Sie nie in ihn setzen Faces.getFlashAttribute("puesto"). Das Feld puesto bereits den Wert enthalten aus dem Drop ausgewählt nach unten, so einfach die getflash entfernen und diese zuordnen aufrufen funktioniert

die letzte Klasse sollte

public void obtenerSueldo(){ 
System.out.println(puesto.getSalarioBase()); 
if(puesto != null){ 
    this.contrato.setSalario(puesto.getSalarioBase()); 
}else{ 
    this.contrato.setSalario(0.0); 
} 

}

Allgemeine Bemerkung sein Erstellen Sie keine lokalen Variablen mit demselben Namen für globale Variablen (Felder). Sie werden ziemlich verwirrend sein.

Verwandte Themen