7

CDIとJSF2を使用する場合HTTPリクエストパラメータをBeanに注入するにはどうすればよいですか?

4

1 に答える 1

19

ヒント: これ以上読む前に、http ://showcase.omnifaces.org/cdi/Paramを参照してください。今日のオムニフェイスが事実上の標準であることに気付くと、自分でやるのはおそらく時代遅れです。当時、オムニフェイスがこれを持っていたら、私はおそらくこれを書いていなかっただろう

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

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

おそらくDeltaspike0.4-incubatingまたは同様のものにも含まれるでしょう。

とはいえ、必要なコードは自分で実装するのはかなり簡単です。以下の例:

注入ポイントに使用する注釈(例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という名前のセッターに注釈を付けると、setMyInstanceという名前のパラメーターが検索されます。

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

FacesContextを注入することに注意してください。これも、生成する必要があります。FacesContextプロデューサーは次のようになります。

class FacesContextProducer {

   @Produces @RequestScoped FacesContext getFacesContext() {

      return FacesContext.getCurrentInstance();

   }

}

最終使用:

@Inject
@RequestParam
private String session_secret;

FacesContextへのアクセスが必要なため、サーブレットなどでは機能しないことに注意してください。そのような場合、たとえば@RequesScopedであるBeanでインジェクションをラップする必要があります。代わりにそのBeanを注入します。

于 2012-11-05T20:36:59.973 に答える