Quando si utilizza CDI e JSF2 In che modo un parametro di richiesta HTTP può essere iniettato in un bean?Parametro di richiesta iniettata di dipendenza con CDI e JSF2
risposta
SUGGERIMENTO:prima di leggere qualsiasi ulteriore dare un'occhiata a http://showcase.omnifaces.org/components/param. Il fai da te è probabilmente obsoleto visto come oggi gli omnifaschi sono uno standard di fatto. Probabilmente non avrei scritto questo se gli omnifasi lo avessero in quel momento
CDI non risolve problemi specializzati come l'iniezione di un parametro di richiesta. Questo dovrebbe essere risolto da estensioni.
Questo è già fornito dalla saldatura. http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html
Sarà probabilmente incluso in Deltaspike 0.4-incubating o simile.
Detto questo, il codice richiesto è piuttosto semplice da implementare. Esempio di seguito:
annotazione da utilizzare per il punto di iniezione (ad esempio 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 "";
}
Ora abbiamo l'annotazione, ma non possiamo solo chiedere il contenitore alla dipendenza iniettare un @RequestParam
- abbiamo ovviamente bisogno di un implementazione.
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);
}
}
Quindi come funziona? Beh, in modo semplice, controlla innanzitutto se hai specificato quale parametro desideri come in @Requestparam("longAndTerribleFieldNameBestToSpecify")
;
Se non lo è, utilizzerà fieldName. Quindi se annoti un setter chiamato setMyInstance cercherà un parametro chiamato setMyInstance.
Il caso di utilizzo normale sarebbe quello di avere una variabile String denominata esattamente come il parametro desiderato.
Nota che inseriamo FacesContext, che deve essere anche prodotto. Un produttore FacesContext potrebbe essere la seguente: l'utilizzo
class FacesContextProducer {
@Produces @RequestScoped FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
}
fine:
@Inject
@RequestParam
private String session_secret;
Si noti che questo non funzionerà per Servlet o simili in quanto richiede l'accesso a FacesContext. In questi casi è necessario avvolgere l'iniezione con un bean che è @RequesScoped. Inietti quel fagiolo invece.