jsf 2 - parameter - Parámetro de solicitud de inyección de dependencia con CDI y JSF2
f param (1)
SUGERENCIA: antes de leer, eche un vistazo a http://showcase.omnifaces.org/components/param . Hágalo usted mismo es probablemente obsoleto al ver cómo omnifaces es un estándar de facto en la actualidad. Probablemente no habría escrito esto si omnifaces tuviera esto en el momento
CDI no resuelve problemas especializados como inyectar un parámetro de solicitud. Eso se supone que debe ser resuelto por extensiones.
Esto ya lo proporciona la soldadura. http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html
Probablemente se incluirá en Deltaspike 0.4-incubating o similar también.
Dicho esto, el código requerido es bastante simple de implementar usted mismo. Ejemplo a continuación:
Anotación para utilizar en el punto de inyección (por ejemplo, private String myParam;
)
import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER })
public @interface RequestParam {
@Nonbinding
public String value() default "";
}
Ahora tenemos la anotación, pero no podemos simplemente pedirle al contenedor que dependa de una @RequestParam
, obviamente necesitamos una implementación.
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
public class RequestParamProducer implements Serializable {
private static final long serialVersionUID = -4260202951977249652L;
@Inject
FacesContext facesContext;
// Producer for @RequestParam
@Produces
@RequestParam
String getRequestParameter(InjectionPoint ip) {
String name = ip.getAnnotated().getAnnotation(RequestParam.class)
.value();
if ("".equals(name))
name = ip.getMember().getName();
return facesContext.getExternalContext().getRequestParameterMap()
.get(name);
}
}
¿Entonces, cómo funciona? Bueno, simplemente, primero verifica si especificó qué parámetro quería como en @Requestparam("longAndTerribleFieldNameBestToSpecify")
;
Si no lo hizo, usará fieldName. Entonces, si anotaste un setter llamado setMyInstance, buscará un parámetro llamado setMyInstance.
El caso de uso normal sería tener una variable String que se llame exactamente como el parámetro que desea.
Tenga en cuenta que inyectamos FacesContext, que también debe producirse. Un productor de FacesContext podría verse así:
class FacesContextProducer {
@Produces @RequestScoped FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
Fin de uso:
@Inject
@RequestParam
private String session_secret;
Tenga en cuenta que esto no funcionará para Servlet o similar ya que requiere acceso a FacesContext. En esos casos, es necesario envolver la inyección con, por ejemplo, un frijol que es @RequesScoped. Usted inyecta ese frijol en su lugar.
Al usar CDI y JSF2, ¿cómo se puede inyectar un parámetro de solicitud HTTP en un bean?