-->

Depedency注入请求参数与CDI和JSF2(Depedency inject request

2019-06-18 20:13发布

当使用CDI和JSF2如何HTTP请求参数注入豆?

Answer 1:

提示: 任何阅读前进一步看看http://showcase.omnifaces.org/cdi/Param 。 自己动手做可能是过时看到omn​​ifaces是怎样一个事实上的标准的今天。 我可能不会写这一点,如果omn​​ifaces有这个在当时

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

如果你没有将使用字段名。 所以,如果你annoted一个名为setMyInstance它会寻找一个叫做setMyInstance参数设置器。

正常使用情况下,将有一个名为就像你想要的参数字符串变量。

请注意,我们注入的FacesContext,那也必须生产。 一个FacesContext制片人看起来是这样的:

class FacesContextProducer {

   @Produces @RequestScoped FacesContext getFacesContext() {

      return FacesContext.getCurrentInstance();

   }

}

最终用途:

@Inject
@RequestParam
private String session_secret;

需要注意的是,因为它需要访问的FacesContext这不会对Servlet或者类似的工作。 在这些情况下需要一个与包住注射例如被@RequesScoped的bean。 可以注入该bean来代替。



文章来源: Depedency inject request parameter with CDI and JSF2