jsf - managedproperty - WELD-001408: dependencias insatisfechas para el tipo Cliente con calificadores @Default
request scope java ee (5)
Debe anotar su clase de cliente con la anotación @Named o @Model:
package de.java2enterprise.onlineshop.model;
@Model
public class Customer {
private String email;
private String password;
}
o crear / modificar beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
Soy un novato de Java EE. Quiero probar JSF y, por lo tanto, hice un programa simple pero no puedo implementarlo. Recibo el siguiente mensaje de error:
cannot Deploy onlineshop-war
deploy is failing=Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private de.java2enterprise.onlineshop.RegisterController.customer
at de.java2enterprise.onlineshop.RegisterController.customer(RegisterController.java:0)
. Please see server.log for more details.
Mi código es el siguiente: Customer.java:
package de.java2enterprise.onlineshop.model;
public class Customer {
private String email;
private String password;
}
registerController.java:
package de.java2enterprise.onlineshop;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.inject.Inject;
import de.java2enterprise.onlineshop.model.*;
@Named
@RequestScoped
public class RegisterController {
private static final long serialVersionUID = 1L;
@Inject
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public String persist() {
return "/index.xhtml";
}
}
Para compilarlo tuve que incluir cdi-api.jar como una biblioteca externa. ¿Alguien aquí podría ayudarme? Gracias a todos de antemano.
El CDI debe descubrir su clase de Customer
como un bean. Para eso tienes dos opciones:
Ponga un bean que define la anotación en él. Como
@Model
es un estereotipo, es por eso que hace el truco. Un calificador como@Named
no es una anotación que define el bean, por lo que no funcionaCambie el modo de descubrimiento de beans en su archivo de bean desde el valor predeterminado "anotado" a "todos" agregando un archivo
beans.xml
en su jar.
Tenga en cuenta que @Named solo tiene un uso: exponga su bean a la interfaz de usuario. Otros usos son para malas prácticas o compatibilidad con el marco heredado.
Para inyectar un Objeto, su clase debe ser conocida por el mecanismo CDI. Usualmente, agregar la anotación @Named hará el truco.
También es bueno asegurarse de tener la importación correcta
Tuve un problema como ese y descubrí que el bean estaba usando
javax.faces.view.ViewScoped;
en lugar de
javax.faces.bean.ViewScoped;
Una sola palabra puede arruinar el mundo a veces ... o simplemente arruinar mi día en este caso.
Tuve el mismo problema pero no tenía nada que ver con las anotaciones. El problema ocurrió al indexar beans en mi contenedor (Jboss EAP 6.3). Uno de mis beans no pudo ser indexado porque usaba las características de Java 8 y recibí esta pequeña advertencia astuta mientras implementaba:
WARN [org.jboss.as.server.deployment] ... No se pudo indexar la clase ... java.lang.IllegalStateException: ¡Etiqueta desconocida! pos = 20 poolCount = 133
Luego en el punto de inyección me salió el error:
Dependencias insatisfechas para el tipo ... con calificadores @Default
La solución es actualizar el índice de anotaciones de Java. descargue la nueva versión de jandex (jandex-1.2.3.Final o más reciente) luego póngala en
JBOSS_HOME / modules / system / layers / base / org / jboss / jandex / main y luego actualice la referencia al nuevo archivo en module.xml
NOTA: EAP 6.4.x ya tiene esto arreglado