Excepción de formato de número al devolver valores de la base de datos (JPA)

Quiero llenar una etiqueta h: datatable simple con algunos valores de una base de datos. Pero obtengo una excepción y no puedo encontrar cuál es la razón:

java.lang.NumberFormatException: para la cadena de entrada: "url"

Así es como creo la tabla de datos:

<h:form>        
    <h:dataTable value="#{managementBB.retrieveRecords()}" var="record">
    <h:column>
        <f:facet name="header">URL</f:facet>
        #{record.url}
    </h:column>
    <h:column>
        <f:facet name="header">Submition date</f:facet>
        #{record.submitionDate}
    </h:column>
    <h:column>
        <f:facet name="header">Unacceptable</f:facet>
        #{record.unnaceptableContent}
    </h:column>
    <h:column>
        <f:facet name="header">Option</f:facet>
        Something
    </h:column>
    </h:dataTable>
</h:form>

Este es el bean de respaldo detrás de esta página:

@Named("managementBB")
@SessionScoped
public class ManagementBB implements Serializable{

    @EJB
    private ILinkManagerEJB linkManagerEJB;

    public List<Record> retrieveRecords() {     
            return linkManagerEJB.retrieveRecords();
    }
}

Este es el EJB que accede a la base de datos para obtener los datos:

@Stateless(name = "ejbs/LinkManagerEJB")
public class LinkManagerEJB implements ILinkManagerEJB {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Record> retrieveRecords() {
        Query allRecords = entityManager.createNamedQuery("allrecordinfo");      
        return (List<Record>) allRecords.getResultList();
    }
}

Y finalmente esta es la entidad JPA que representa una fila en la base de datos:

@Entity
@NamedQueries({@NamedQuery(name = "allrecordinfo",
   query = "SELECT r.url, r.submitionDate, r.unnaceptableContent FROM Record r")})
public class Record {

    @Id
    @GeneratedValue
    private long id;
    @Column(nullable = false)
    private String url;
    @Column(nullable = false)
    private String submitionDate;
    @Column(nullable = false)
    private boolean unnaceptableContent;

    //Get set methods ...
}

Como ve, parece simple, y he hecho esto antes, pero ahora estoy confundido, no sé por qué no funciona. ¿Podrías ayudarme a encontrar mi error?

Nota: estoy bastante seguro de que la sintaxis de la consulta está bien (la probé en el álbum de recortes de eclipse)

preguntado el 27 de agosto de 11 a las 18:08

3 Respuestas

java.lang.NumberFormatException: para la cadena de entrada: "url"

 #{record.url}

Esto sugiere que Record is Realmente an Object[] porque espera un índice entero como ese

#{record[0]}

De hecho, su consulta es incorrecta, no está seleccionando el Record, pero solo campos individuales, que devolverían un List<Object[]> con los campos individuales en lugar de List<Record>. El elenco (que habría generado una advertencia) no evita / cambia eso.

Respondido el 20 de junio de 20 a las 12:06

Ups, creo que entiendo, eso significa que necesito algo como Select * from Record - javing

Mientras escribía mi respuesta, vi que Ammar ya publicó una respuesta con la sintaxis correcta (también la voté a favor), así que la omití para no molestarlo. Solo estaba tratando de explicar la causa subyacente para que se pudiera entender la excepción. - BalusC

Lo acabo de arreglar ahora. Fue un error tonto, no es la primera vez que me pasa :) Gracias. - javing

La consulta no es correcta.

@NamedQueries({ @NamedQuery(name = "allrecordinfo", query = "SELECT r FROM Record r") })
@Entity
public class Record {
}

Respondido 27 ago 11, 22:08

Eso es correcto, gracias Ammar. Aceptaré tu respuesta en 10 minutos. :) - javing

Para evitar un error como este en el futuro, debe usar una consulta escrita en lugar de una conversión.

La conversión del resultado de la consulta a partir de una consulta sin tipo es una práctica bastante antigua (desde 2006 en realidad) que ya no debería utilizarse.

Algunas sugerencias adicionales: no es necesario que especifique un nombre explícito para su EJB. Solo @Stateless es suficiente. Lo mismo se aplica al bean CDI, que obtendrá un nombre predeterminado.

Entonces, es posible que desee reconsiderar el nombre de la interfaz de EJB. La inicial I está un poco mal vista últimamente.

Además, es más común crear un captador para los datos que está devolviendo del bean de respaldo. Después de eso, puede usar un enlace de valor (omita el () en la expresión EL).

Finalmente, es posible que desee mover la llamada a su EJB a un método @PostConstruct, ya que JSF podría llamar a los métodos de su bean de respaldo muchas veces, lo que ahora resultará en una llamada a la base de datos cada vez. Si hace eso, su bean también debería ser el mejor en el alcance de la vista, pero eso significa que tiene que pasar de los beans CDI a los beans administrados por JSF regulares, o usar la costura 3.

Respondido 28 ago 11, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.