2016-04-06 17 views
1

Ich muss diese geschäftlichen Anforderungen zu lösen, aber ich bin etwas unerwünschtes Verhalten und ich brauche die Hilfe der Experten. Ich JSF mit 2.2.13, Gesichter Prime 5.3mehrere verwaltete Eigenschaften der gleichen Bean, in der gleichen Klasse

ich eine UserBean ähnliche ähnliche

@ManagedBean(name = "countryBean") 
@RequestScoped 
public class CountryBean implements Serializable{ 
    private Long id; 
    private String isoCode; 
    private String phoneCode; 
    ... 
    ...getter/setter 

Das Problem

@ManagedBean(name = "userBean") 
@RequestScoped 
public class UserBean implements Serializable { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    @ManagedProperty(value = "#{countryBean}") 
    private CountryBean phoneCode1; 
    private String phoneNumber1; 
    @ManagedProperty(value = "#{countryBean}") 
    private CountryBean phoneCode2; 
    private String phoneNumber2; 
... 
...getter/setter 

und CountryBean haben (wie Sie wahrscheinlich bereits wissen,) ist das innerhalb der UserBean haben wir mehr als 1 Feld (phoneCode1, phoneCode2) der gleichen verwalteten Eigenschaft (countryBean).

Das seltsame Verhalten ist, dass in der Datenbank (MySQL), meine Anwendung den gleichen Wert für alle diese Felder (phoneCode1, phoneCode2) speichern, auch wenn wir im Front-End verschiedene Werte auswählen.

Im Frontend habe ich dieses Stück Code

<h:selectOneMenu value="#{userController.userBean.phoneCode1.id}" class="form-control"> 
    <f:selectItem itemLabel="#{msg['seleziona']}" itemValue="" noSelectionOption="true" /> 
    <f:selectItems value="#{applicationScopedBean.countries}" var="ac" itemValue="#{ac.id}" itemLabel="#{ac.phoneCode}"/> 
</h:selectOneMenu> 
<h:selectOneMenu value="#{userController.userBean.phoneCode2.id}" class="form-control"> 
    <f:selectItem itemLabel="#{msg['seleziona']}" itemValue="" noSelectionOption="true" /> 
    <f:selectItems value="#{applicationScopedBean.countries}" var="ac" itemValue="#{ac.id}" itemLabel="#{ac.phoneCode}"/> 
</h:selectOneMenu> 

Also, auf welche Weise wir diese Geschäftsanforderungen lösen können?

Ich habe ähnliche Fragen gesehen, aber ich verstehe nicht, wenn ich nicht sehr gut JSF verwende, oder wenn es eine JSF-Beschränkung ist. Aus der Sicht einer Datenbank es ähnlich ist zu fragen: „In welcher Art und Weise kann ich eine Tabelle erstellen, genannt‚‘mit einigen FK in die Tabelle verknüpft‚B‘A?

Thank you!

+1

Gibt es einen bestimmten Grund, warum Ihre CountryBean eine Bohne und eine verwaltete Eigenschaft ist? Ich lerne immer noch selbst, aber ich glaube nicht, dass du sie anders als eine Schnur behandeln musst. – klog

+0

Land ist ein db Lookup-Tabelle und ich brauche die ID und den Namen – Gavi

+0

Ich nicht unterbewerten, warum UserBean und CountryBean sind JSF ManagedBean, .. Sie sind nur einfache Datenstrukturen –

Antwort

0

in der Tat war der Fehler, dass in diesem Fall kein Grund, es gab die Anmerkung @ManagedProperty zu verwenden.

Wenn mehr als eine Instanz im selben Bereich vorhanden ist, ist die Verwendung der @ManagedProperty nutzlos.

Der Zweck der @ManagedProperty besteht darin, die einzige verfügbare Instanz im verwendeten Bereich zu identifizieren.

-1

Anstelle von @RequestScoped@NoneScoped für CountryBean verwenden.

None Scope

+1

Bitte fügen Sie dies in Kommentar Abschnitt .... Sie immer noch nicht sicher über deine Antwort. –

+0

Ich brauche 50 Ruf zu kommentieren. – Ravi

+1

dann versuchen Sie, die Frage zu beantworten, die Sie zu 100% bestätigt haben –

0

Ich hatte eine sehr ähnliche Situation wie Ihre, aber ein bisschen komplexer, da ich mehrere verwaltete Eigenschaften der gleichen Bohne in einer "Parent" -Bohne und auch in den Bohnen als verwaltete Eigenschaften in ist Eigenschaften zu anderen Bohnen. Dies liegt daran, dass all diese "Kind" -Bohnen an Front-End-Elemente gebunden sind und wiederverwendbar sein müssen (im Grunde ein 3-Dropdown-Listenelement, das verwendet wird, um den Benutzer nach der Adresse seines Hauses, seines Jobs und anderen zusätzlichen Orten zu fragen). Und das Problem war, dass, wenn der Benutzer die Adresse für einen Ort auswählt, die Werte an den anderen 3 Orten wiederholt werden.

So war meine Lösung für dieses Problem alle „Kind“ Bohnen zu setzen (die wiederverwendbar sind) als @NoneScoped und die „Eltern“ Bohne als @ViewScoped

Und das funktionierte perfekt, für jeden Standort die Adressen nicht mehr sich gegenseitig stören. Und all dies mit immer noch mehreren verwalteten Eigenschaften der gleichen Bean in der "Eltern" -Bohne.

Hoffe das funktioniert für jemanden mit einem ähnlichen Problem.

Verwandte Themen