2008-10-01 5 views
6

Ich habe ein Problem mit meinem Seam-Code und ich kann nicht scheinen, herauszufinden, was ich falsch mache. Es tut meinen Kopf in :) Hier ist ein Auszug aus dem Stack-Trace:Seam Problem: Feld Wert konnte nicht durch Reflexion festgelegt werden

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.oobjects.sso.manager.home.PresenceHome.customerId to java.lang.String 

Ich versuche, einen Parametersatz auf meiner URL in einen meiner Bohnen geführt zu bekommen. Um dies zu tun, ich habe das in meinem pages.xml setzen folgende:

<page view-id="/customer/presences.xhtml"> 
    <begin-conversation flush-mode="MANUAL" join="true" /> 
    <param name="customerId" value="#{presenceHome.customerId}" /> 
    <raise-event type="PresenceHome.init" /> 
    <navigation> 
    <rule if-outcome="persisted"> 
     <end-conversation /> 
     <redirect view-id="/customer/presences.xhtml" /> 
    </rule> 
    </navigation> 
</page> 

Meine Bohne beginnt wie folgt aus:

@Name("presenceHome") 
@Scope(ScopeType.CONVERSATION) 
public class PresenceHome extends EntityHome<Presence> implements Serializable { 
    @In 
    private CustomerDao customerDao; 

    @In(required = false) 
    private Long presenceId; 

    @In(required = false) 
    private Long customerId; 

    private Customer customer; 

    // Getters, setters and other methods follow. They return the correct types defined above 
} 

Schließlich wird die Verbindung, die ich verwenden Sie eine eine Seite der Verknüpfung Das nächste sieht so aus:

<s:link styleClass="#{selected == 'presences' ? 'selected' : ''}" 
    view="/customer/presences.xhtml" title="Presences" propagation="none"> 
    <f:param name="customerId" value="#{customerId}" /> 
    Presences 
</s:link> 

All dies scheint gut zu funktionieren. Wenn ich über den Link oben auf meiner Seite schwebe, bekomme ich eine URL, die etwa mit "? CustomerId = 123" endet. Daher wird der Parameter übergeben und es kann leicht in einen Long-Typ konvertiert werden. Aber aus irgendeinem Grund ist es nicht. Ich habe ähnliche Dinge schon früher in anderen Projekten gemacht und es hat dann funktioniert. Ich kann nicht sehen, was es jetzt nicht funktioniert.

Wenn ich das Element von meiner Seitendeklaration entferne, komme ich zur Seite gut durch.

Hat also jemand irgendwelche Gedanken?

Antwort

7

Sie wollen einen Konverter Ihre pages.xml Datei hinzuzufügen. Gefällt mir:

<param name="customerId" 
     value="#{presenceHome.customerId}" 
converterId="javax.faces.Long" /> 

Weitere Details finden Sie im Seampay-Beispiel mit Naht.

0

Versuch: ... <f:param name="customerId" value="#{customerId.toString()}" /> ...

0

Unser Code macht etwas ähnliches, aber mit der customerId Eigenschaft in der Java-Klasse als String:

private String customerId; 

public String getCustomerId() { 
    return customerId; 
} 

public void setCustomerId(final String customerId) { 
    this.customerId = customerId; 
} 
0

Sie könnten versuchen, einen Eigenschaftseditor zu verwenden.

diese in das gleiche Paket wie das Bean Put:

import java.beans.PropertyEditorSupport; 

public class PresenceHomeEditor extends PropertyEditorSupport { 
    public void setAsText(final String text) throws IllegalArgumentException { 
     try { 
      final Long value = Long.decode(text); 
      setValue(value); 
     } catch (final NumberFormatException e) { 
      super.setAsText(text); 
     } 
    } 
}