我在下面开了一个课;
package org.domain.emlakprojesi.session;
import java.util.List;
import javax.persistence.EntityManager;
import org.domain.emlakprojesi.entity.ziyaretci;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;
@Name("authenticator")
public class Authenticator
{
@Logger private Log log;
@In Identity identity;
@In Credentials credentials;
@In EntityManager entityManager;
@Out(scope =ScopeType.SESSION,required=false) ziyaretci girisYapanZiyaretci;
public boolean authenticate()
{
log.info("authenticating {0}", credentials.getUsername());
List<ziyaretci> ziyaretciler =entityManager.createQuery("from Ziyaretci where email = #{credentials.username} and sifre = #{credentials.password}").getResultList();
if(ziyaretciler.size() == 1){
this.setGirisyapanziyaretci(ziyaretciler.get(0));
return true;
}else
return false;
}
public void setGirisyapanziyaretci(ziyaretci girisyapanziyaretci) {
this.girisYapanZiyaretci= girisyapanziyaretci;
}
public ziyaretci getGirisyapanziyaretci() {
return girisYapanZiyaretci;
}
}
我在认证方法
中设置了girisYapanZiyaretci当我运行应用程序时,我得到空指针异常
我实际上问@In和@Out注释何时起作用?
答案 0 :(得分:2)
使用@In
注入以及所谓的 outjection 并使用@Out
工作。
在调用方法之前注入所有@In
属性,并且在调用之后在定义的上下文中设置所有@Out
属性,除非该方法引发异常。
会话范围比事件范围更广,因此如果在事件范围的bean中注入会话范围bean,则事件范围(以及事件范围bean)将在会话范围bean之前销毁。
相反,如果在会话范围bean(或任何其他更广泛的范围上下文)中注入事件范围的bean,则在方法调用之前注入该值,并在方法调用之后将其设置为null
。
关于注入和JSF阶段,注入发生在更新模型值阶段之后和调用应用程序阶段之内。不过,@Filter
和@Converter
违反了此规则。
答案 1 :(得分:0)
@In
注释获取树参数:value, create
和required
在Seam documantation中,有一些简短的解释。
指定通过评估a来注入组件属性 每个组件调用开始时的JSF EL表达式。
value - 指定上下文变量的名称。默认为 组件属性的名称。或者,指定JSF EL 表达式,由#{...}包围。
创建 - 指定Seam应使用实例化实例化组件 如果上下文变量未定义,则与上下文变量同名 (null)在所有上下文中。默认为false。
必需 - 指定Seam应该在上下文中抛出异常 变量在所有上下文中都是未定义的。
也许create
参数,如果它为空,则创建Context Variable
,可以帮助您解决问题。
@In(create = true)