2012-11-05 19 views

答えて

18

ヒント:さらに読む前にhttp://showcase.omnifaces.org/components/paramをご覧ください。 今日、事実上の標準がどのように全世界が標準であるかを見ると、おそらく時代遅れです。私はおそらくこれを書いたことはありませんが、時にはこれがあれば

CDIはリクエストパラメータの注入などの特殊な問題を解決しません。それは拡張機能によって解決されるはずです。

これははんだによって既に提供されています。 http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html/injectablerefs.html

おそらくDeltaspike 0.4-インキュベーションまたはそれに類するものに含まれるであろう。

これは、必要なコードは自分で実装するのが簡単だと言っています。以下の例:

注釈(たとえば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 ""; 
} 

を使用するには、今、私たちは、アノテーションを持っているが、我々はちょうど@RequestParamを注入依存性の容器を求めることはできません - 私たちは明らかに必要実装。

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

どのように機能しますか?まず、あなたが望むパラメータを@Requestparam("longAndTerribleFieldNameBestToSpecify")のように指定したかどうかを最初に確認します。

フィールド名を使用しない場合は、fieldNameを使用します。 setMyInstanceという名前のsetterをアノテーションした場合、setMyInstanceというパラメータが検索されます。

通常の使用例では、必要なパラメータとまったく同じ名前のString変数を使用します。

生成する必要があるFacesContextを挿入することに注意してください。

class FacesContextProducer { 

    @Produces @RequestScoped FacesContext getFacesContext() { 

     return FacesContext.getCurrentInstance(); 

    } 

} 

エンド用法:それはのFacesContextへのアクセスを必要として、これはサーブレットまたは類似のために動作しないことに

@Inject 
@RequestParam 
private String session_secret; 

ノートのFacesContextプロデューサーは、次のようになります。そのような場合、@RequesScopedなどのBeanなどで注入をラップする必要があります。代わりにそのBeanを注入します。