2008-10-01 23 views
6

Tengo un problema con mi código de costura y parece que no puedo entender lo que estoy haciendo mal. Que está haciendo en mi cabeza :) He aquí un extracto de la traza de la pila:Problema de costura: No se pudo establecer el valor del campo por reflexión

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

Estoy tratando de obtener un conjunto de parámetros en la URL de mi pasado a uno de mis frijoles. Para ello, tengo la siguiente configuración en mi pages.xml:

<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> 

Mi frijol comienza así:

@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 
} 

Finalmente el enlace que utilizo para enlazar una sola página a la A continuación se ve así:

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

Todo esto parece funcionar bien. Cuando cierro el enlace de arriba en mi página, obtengo una URL que termina en algo como "? CustomerId = 123". Por lo tanto, el parámetro se está pasando por alto y es algo que se puede convertir fácilmente en un tipo largo. Pero por alguna razón, no lo es. He hecho cosas similares a esto antes en otros proyectos y funcionó entonces. Simplemente no puedo ver lo que no funciona ahora.

Si elimino el elemento de la declaración de mi página, puedo acceder a la página correctamente.

Entonces, ¿alguien tiene alguna idea?

Respuesta

7

desea agregar un convertidor para su archivo pages.xml. De esta manera:

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

Vea el ejemplo de seampay proporcionado con la costura para obtener más detalles.

0

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

0

Nuestro código hace algo similar, pero con la propiedadcustomerId en la clase de Java como una cadena :

private String customerId; 

public String getCustomerId() { 
    return customerId; 
} 

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

Podría intentar usar un editor de propiedades.

poner esto en el mismo paquete que el bean:

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