我怎么可以注入的依赖一样@EJB,@PersistenceContext,@Inject,@AutoWired,等的@FacesConverter?在我的具体情况下,我需要通过@EJB以下方式注入EJB :
@FacesConverter
public class MyConverter implements Converter {
@EJB
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// myService.doSomething
}
}
Run Code Online (Sandbox Code Playgroud)
然而,它没有被注射并且仍然存在null,导致NPE.看来,@PersistenceContext和@Inject也不起作用.
如何在转换器中注入服务依赖项以便我可以访问数据库?
我有一个简单的AttributeConverter实现,我尝试注入一个必须提供转换逻辑的对象,但@Inject似乎不适用于这种情况.转换器类看起来像这样:
@Converter(autoApply=false)
public class String2ByteArrayConverter implements AttributeConverter<String, byte[]>
{
@Inject
private Crypto crypto;
@Override
public byte[] convertToDatabaseColumn(String usrReadable)
{
return crypto.pg_encrypt(usrReadable);
}
@Override
public String convertToEntityAttribute(byte[] dbType)
{
return crypto.pg_decrypt(dbType);
}
}
Run Code Online (Sandbox Code Playgroud)
当@Converter触发它时会抛出一个NullPointerException因为该属性crypto没有从容器初始化.这是为什么?
我正在使用Glassfish 4,在所有其他情况下@Inject工作得很好.
是否无法在转换器上使用CDI?
任何帮助将不胜感激 :)
我的问题的重点是AttributeConverter部分.我知道,要使CDI工作,bean必须满足http://docs.oracle.com/javaee/6/tutorial/doc/gjfzi.html所述的条件.我也尝试通过实现以下构造函数来强制CDI工作:
@Inject
public String2ByteArrayConverter(Crypto crypto)
{
this.crypto = crypto;
}
Run Code Online (Sandbox Code Playgroud)
现在我得到以下异常,但没有给我任何线索:
2015-07-23T01:03:24.835+0200|Severe: Exception during life cycle processing
org.glassfish.deployment.common.DeploymentException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: …Run Code Online (Sandbox Code Playgroud) 尝试从我的应用程序中的表中删除或编辑用户时出现转换错误.该值将从元数据传递listUser.xhmtl到deleteUser.xhtml页面.该值正在元数据中传递,但出于某种原因,在调用delete操作时,我得到了Conversion Error setting value "someemail@somedomain.com" for 'null Converter'.用户标识是String.
这是请求userDelete.xhmtl后的url:
http://localhost:8080/lavpWebApp/user/deleteUser.xhtml?user=someemail%40somedomain.com
Run Code Online (Sandbox Code Playgroud)
这是userList.xhmtl简化:
<h:column>
<f:facet name="header">Edit</f:facet>
<h:link outcome="/user/editUser.xhtml" value="Edit User">
<f:param name="user" value="#{item.email}"/>
</h:link>
</h:column>
<h:column>
<f:facet name="header">Delete</f:facet>
<h:link outcome="/user/deleteUser.xhtml" value="Delete User">
<f:param name="user" value="#{item.email}"/>
</h:link>
</h:column>
Run Code Online (Sandbox Code Playgroud)
这是userDelete.xhtml简化:
<f:metadata>
<f:viewParam name="user" value="#{userController.user}" converter="#{userConverter}"/>
</f:metadata>
<h:body>
Do you want to delete #{userController.user.name}?
<h:form>
<h:commandButton action="#{userController.deleteUser()}"
value="Delete"/>
<h:commandButton action="#{userController.doCancelDeleteUser()}"
value ="Cancel"/>
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)
这是Converter类:
@ManagedBean
@FacesConverter(value="userConverter")
public class UserConverter implements Converter{
@EJB
private UserSellerEJB userEjb;
@Override
public Object …Run Code Online (Sandbox Code Playgroud) 1和JSF 2.0 + primefaces很酷:D
我有这个验证器,但我不能正确地注入持久性单元.
所有其他bean都正常工作,这是唯一没有的,它给了我一个Nullpointer roleFacade
注入验证器是非法的吗?是否在生命周期中过早?它能是什么?
谢谢 !
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter("rolesConverter")
@Stateless
public class RolesConverter implements Converter{
@EJB
private RoleFacade roleFacade;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Roles role = null;
if ((value != null) && (!value.equals(""))) {
role = roleFacade.find(Long.valueOf(value));
}
return role;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Integer retorno = null;
if (!(value == null)) { …Run Code Online (Sandbox Code Playgroud) 这converter是从我的JSF调用的.我已在里面注册了faces-config.xml
public class ProjectConverter implements Converter{
@EJB
DocumentSBean sBean;
@ManagedProperty(value="#{logging}")
private Logging log;
public ProjectConverter(){
}
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
if(value.trim().equals("")){
return null;
}
return sBean.getProjectById(value);
}
public String getAsString(FacesContext context, UIComponent component, Object value)
{
if(value == null){
return null;
}
return String.valueOf(((Project) value).getId());
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到了java.lang.NullPointerException,当我进入时getAsObject(),主要原因是因为我的会话Bean sBean为空.我不知道如何解决这个问题,我需要访问我的Session bean,以便我可以从我的数据库中查询