CDIとJSF2を使用する場合HTTPリクエストパラメータをBeanに注入するにはどうすればよいですか?
1 に答える
ヒント: これ以上読む前に、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を注入します。