2016-05-31 11 views
1

Ich habe ein Verbundbauteil mit einer Trägerkomponente:Wie kann man in der Backing-Komponente einer Composite-Komponente auf EntityManager zugreifen?

Xhtml des Verbundbauteils:

<?xml version="1.0" encoding="UTF-8"?> 
<!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:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:composite="http://java.sun.com/jsf/composite" xmlns:c="http://java.sun.com/jsp/jstl/core"> 

    <composite:interface componentType="editorCompositeComponent"> 
     <!-- ...bunch of attributes... --> 
     <composite:attribute name="content" type="java.lang.String" default="" /> 
    </composite:interface> 

    <composite:implementation> 
     <!-- ... other components ... --> 
     <p:editor widgetVar="editorWidget" value="#{cc.attrs.content}" width="600" maxlength="8000" /> 
     <p:commandButton action="#{cc.save(cc.attrs.caseId)}" value="Save" /> 
    </composite:implementation> 

</html> 

Backing-Komponente:

@FacesComponent("editorCompositeComponent") 
public class EditorCompositeComponent extends UINamingContainer { 

    private String content; 
    // bunch of other variables 

    public void save(String caseId) { 

    MemoFile memoFile = new MemoFile(); 
    memoFile.setContent(content); 
    memoFileService = new MemoFileService(); 
    // Normally this service would be Injected but Injection 
    // isn't possible in @FacesComponent 

    memoFileService.save(memoFile); 
    // the save-method just calls EntityManager's merge etc. 
    // It works well in all the ManagedBeans 
    } 
    // all the getters and setters 
} 

Also, nicht Sachen injizieren kann und kann nicht Suchen Sie nach EntityManager. Wie würde man also den Inhalt des Editors in der Composite-Komponente beibehalten?

Antwort

1

Die Abhängigkeitsinjektion wird in UI-Komponenten nicht unterstützt. Das ist ein bisschen zu eng verbunden mit den Verantwortlichkeiten. Benutzeroberflächenkomponenteninstanzen sollen nicht vom Container verwaltet werden.

Ihre beste Wette ist es, eine separate beanspruchte Bean für die Task zu erstellen.

@Named 
@RequestScoped 
public class EditorCompositeBean { 
    // ... 
} 

Sie konnten die Verbundkomponenteninstanz seiner Wirkung Methode übergeben:

<p:commandButton ... action="#{editorCompositeBean.save(cc)}" /> 

Oder die Bohne als Modell statt:

<composite:interface componentType="editorCompositeComponent"> 
    <composite:attribute name="value" type="com.example.EditorCompositeBean" /> 
</composite:interface> 

<composite:implementation> 
    <p:editor ... value="#{cc.attrs.value.content}" /> 
    <p:commandButton ... action="#{cc.attrs.value.save}" /> 
</composite:implementation> 
+0

Danke. Ich hatte es zuerst mit einem ManagedBean als Backing-Bean der Komponente, aber realisiert, dass, weil ich mehrere Instanzen der gleichen Composite-Komponente in der gleichen Ansicht haben möchte ich eine @FacesComponent dafür erstellen muss. –