2012-11-05 9 views

Antwort

18

TIPP:bevor Sie weiterlesen, werfen Sie einen Blick auf http://showcase.omnifaces.org/components/param. Do it yourself ist wahrscheinlich veraltet zu sehen, wie Omnifaces heute ein De-facto-Standard ist. Ich hätte das wahrscheinlich nicht geschrieben, wenn omnifaces dies zu der Zeit hatte

CDI löst nicht spezialisierte Probleme wie das Eingeben eines Anforderungsparameters. Das soll durch Erweiterungen gelöst werden.

Dies wird bereits durch Löten bereitgestellt. http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html

Es wird wahrscheinlich in Deltaspike 0.4-Inkubation oder ähnlich auch enthalten sein.

Der genannte Code ist ziemlich einfach zu implementieren. Beispiel unten:

Annotation für die Injektionsstelle zu verwenden (zum Beispiel 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 ""; 
} 

Jetzt haben wir die Anmerkung, aber wir können nicht nur den Container stellen eine @RequestParam der Abhängigkeits zu injizieren - wir ein offensichtlich brauchen Implementierung.

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

Wie funktioniert es? Nun, ganz einfach zuerst überprüft, ob Sie den gewünschten Parameter wie in @Requestparam("longAndTerribleFieldNameBestToSpecify") angegeben haben;

Wenn nicht, wird der fieldName verwendet. Wenn Sie also einen Setzer namens setMyInstance annotieren, sucht er nach einem Parameter namens setMyInstance.

Der normale Anwendungsfall wäre eine String-Variable, die genau wie der gewünschte Parameter benannt ist.

Beachten Sie, dass wir FacesContext injizieren, der auch produziert werden muss. Ein Faces Produzent könnte wie folgt aussehen:

class FacesContextProducer { 

    @Produces @RequestScoped FacesContext getFacesContext() { 

     return FacesContext.getCurrentInstance(); 

    } 

} 

End Nutzung:

@Inject 
@RequestParam 
private String session_secret; 

Beachten Sie, dass dies nicht für Servlets oder ähnlich funktionieren wie sie den Zugang zu Faces erfordert. In diesen Fällen muss die Injektion beispielsweise mit einer Bean umhüllt werden, die @RequesScoped ist. Du spritzt stattdessen diese Bohne ein.

Verwandte Themen