2016-04-28 6 views
0

Sie möchten das Resultset einer Abfrage filtern, die über eine Datentabelle angezeigt wird. Die Zeilenauswahl, die Zeilensortierung, das Klicken auf die Spaltenüberschriften und die Seitenumbruchfunktionen der Datentabelle funktionieren einwandfrei. Wenn ich die primefaces Filterung functionnality zum Datentabelle hinzufügen, laufe ich dann in dieDataModel muss die org.primefaces.model.SelectableDataModel-Ausnahme mithilfe des primafaces-Filters implementieren.

javax.faces.FacesException: Datamodel org.primefaces.model.SelectableDataModel implementieren müssen, wenn eine Auswahl aktiviert ist.

Objekt Entity:

@Entity 
@Table(name="Customer", 
     uniqueConstraints={@UniqueConstraint(columnNames={"ID"})}) 

public class Customer { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID", nullable=false, unique=true, length=11) 
    private Integer id; 

    @Column(name="LASTNAME", length=40, nullable=false) 
    private String lastName; 

    @Column(name="FIRSTNAME", length=30, nullable=true) 
    private String firstName; 
.... 
} 

Managed Bean:

@ManagedBean(name = "customerController") 
@ViewScoped 

public class CustomerController implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private Customer selectedCustomer = new Customer(); 
    private List<Customer> customers = new ArrayList<Customer>(); 
    private String message; 

    public CustomerController() { 
    } 

    @PostConstruct 
    void init() {   
     CustomerDAO custDAO = new CustomerDAO(); 
     customers = custDAO.getAllCustomers(); 

     // select first row 
     if (customers != null) selectedCustomer=customers.get(0); 
    } 

    public void onRowSelect(SelectEvent event) { 
     message = ""; 
    } 

    public void onRowUnselect(UnselectEvent event) { 
     message = ""; 
    } 

    // getters and setters 
    ... 
} 

Facelet:

<ui:define name="contentPart1" >    
    <h:form id="contentPart1Form"> 
     <p:dataTable id="singleSelection" var="customer" value="#{customerController.customers}" rowKey="#{customer.id}" 
      selection="#{customerController.selectedCustomer}" selectionMode="single" paginator="true" rows="10"> 
      <p:ajax event="rowSelect" listener="#{customerController.onRowSelect}" /> 

      <p:column headerText="#{msg['customerCRUD.labelIdentifier']}" style="width:15%;"> 
       <h:outputText value="#{customer.id}" readonly="#{facesContext.currentPhaseId.ordinal eq 6}"/> 
      </p:column> 
      <p:column headerText="#{msg['customerCRUD.labelFirstName']}" sortBy="#{customer.firstName}" style="width:30%;"> 
       <h:outputText value="#{customer.firstName}" /> 
      </p:column> 
      <p:column headerText="#{msg['customerCRUD.labelLastName']}" filterBy="#{customer.lastName}" filterMatchMode="contains" 
       sortBy="#{customer.lastName}"> 
       <h:outputText value="#{customer.lastName}" /> 
      </p:column> 

      <f:facet name="footer"> 
       <h:outputText value=" "/> 
      </f:facet>     
     </p:dataTable>    
    </h:form> 
</ui:define> 

Antwort

1

Nach Stunden der Untersuchung, ich erkannte schließlich das Objekt Einheit, auf dem ich war Das Anwenden des Filters war nicht serialisierbar. Die Auflösung sollte die Objekteinheit von der Serialisierungsklasse erben.

@Entity 
@Table(name="Customer", 
     uniqueConstraints={@UniqueConstraint(columnNames={"ID"})}) 

public class Customer implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L;{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID", nullable=false, unique=true, length=11) 
    private Integer id; 

    @Column(name="LASTNAME", length=40, nullable=false) 
    private String lastName; 

    @Column(name="FIRSTNAME", length=30, nullable=true) 
    private String firstName; 
.... 
} 
+1

Serializable ist eine Schnittstelle, so dass Sie nicht erben, sondern implementieren –

Verwandte Themen