如何解决JSF2.3 FacesConverter 托管无法注入无状态服务
环境:
- 野蝇 22
- Java 11
- JSF 2.3
我创建了一个 @FacesConverter managed=true 但是当我尝试 @Inject 一个 @Stateless 类时,我得到了 null。
face.xhtml
...
<h:outputText value="#{workBean.work.type.name}" rendered="#{!workBean.editable}"/>
<p:selectOneMenu id="cbxType" value="#{workBean.work.type}"
required="true" requiredMessage="#{msgs.wrk_reqtype}"
converter="workTypeConverter"
rendered="#{workBean.editable}">
<f:selectItem itemLabel="#{msgs.select}" itemValue="#{null}" noSelectionOption="false" />
<f:selectItems value="#{workBean.types}" var="t"
itemValue="#{t}" itemLabel="#{t.name}"/>
</p:selectOneMenu>
...
WorkTypeConverter
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import javax.inject.Inject;
import java.time.format.DateTimeParseException;
@FacesConverter(value = "workTypeConverter",managed = true)
public class WorkTypeConverter implements Converter {
@Inject
WorkTypeManager typeMgr; //null¿?
@Override
public Object getAsObject(FacesContext context,UIComponent component,String value) {
if (value == null || value.isEmpty()) {
return null;
}
try {
return typeMgr.findById(Integer.parseInt(value));
} catch(Exception e){
throw new ConverterException(new FacesMessage(value + " string is not a valid WorkType"));
}
}
@Override
public String getAsString(FacesContext context,Object value) {
if (value == null) {
return null;
}
if (value instanceof WorkType) {
return ((WorkType)value).getId().toString();
} else {
throw new ConverterException(new FacesMessage(value + " object is not a valid WorkType"));
}
}
}
pom.xml 依赖
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
解决方法
您不能在 FacesConverter 或 FacesComponent 中使用 @Inject。但是您可以通过编程方式获取 CDI bean。例如
CDI.current().select(WorkTypeManager.class).get();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。