这仅适用于 JSF 2.3 中引入的javax.faces.annotation.ManagedProperty https://jakarta.ee/specifications/platform/8/apidocs/javax/faces/annotation/ManagedProperty.html.
@Inject @ManagedProperty("#{param.id}")
private String id;
现在已弃用javax.faces.bean.ManagedProperty https://jakarta.ee/specifications/platform/8/apidocs/javax/faces/bean/ManagedProperty.html注释仅适用于 JSF@ManagedBean
类。 IE。在由 JSF 管理的实例中。它不适用于由 CDI 管理的实例@Named
。此外,你还犯了另一个错误:你试图准备Message
基于构造函数中的托管属性。如果这是一个真实的@ManagedBean
,那也是行不通的。托管属性在构造期间不可用,只是因为在调用构造函数之前不可能调用 setter 方法。你应该使用过@PostConstruct
方法用于此。
如果您无法升级到 JSF 2.3,则需要创建自定义 CDI 注释。具体的例子发布在这个博客 http://www.glxn.net/?p=141。以下是相关性的摘录:
习俗@HttpParam
注解:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HttpParam {
@NonBinding
public String value() default "";
}
注释值生产者:
public class HttpParamProducer {
@Inject
FacesContext facesContext;
@Produces
@HttpParam
String getHttpParameter(InjectionPoint ip) {
String name = ip.getAnnotated().getAnnotation(HttpParam.class).value();
if ("".equals(name)) name = ip.getMember().getName();
return facesContext.getExternalContext()
.getRequestParameterMap()
.get(name);
}
}
使用示例:
@Inject @HttpParam
private String id;
JSF 实用程序库OmniFaces http://omnifaces.org has a @Param http://showcase.omnifaces.org/cdi/Param正是为了这个目的,内置了对 JSF 转换和验证的支持。
或者,您也可以手动从外部上下文中获取请求参数Detail
托管 bean。推荐的托管 bean 初始化方法是使用@PostConstruct
方法,而不是构造函数,作为构造函数could与托管 bean 创建的用途完全不同:
@PostConstruct
public void init() {
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
// ...
}
另一种方法,IMO也更适合这种特殊情况,是使用<f:viewParam>
它还允许您将 ID 转换为Message
直接通过自定义转换器。
<f:metadata>
<f:viewParam name="id" value="#{detail.message}" converter="messageConverter" />
</f:metadata>
只用
@Named
public class Detail {
private Message message;
// Getter+setter
}
and a
@FacesConverter("messageConverter")
public class MessageConverter implements Converter {
// Convert string id to Message object in getAsObject().
// Convert Message object to string id in getAsString().
}
See also
- ViewParam 与 @ManagedProperty(value = "#{param.id}") https://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id
- JSF 2.0 中的通信 - 处理 GET 请求参数 http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ProcessingGETRequestParameters