我有一个问题,可能源于我对jsf和面对servlet概念的不理解......我终于得到了我的jsf应用程序在谷歌应用程序引擎上工作。这花了很多时间和一些变通方法,但它已启动并运行:)现在我想使用应用程序中的数据为Android应用程序。没问题,我想,但当然有...我想我可以在jsf应用程序中添加一个额外的servlet并访问我用于网页的相同cdi bean。显然它并不那么容易。当我尝试将bean注入额外的servlet时,它们为null。当我为我的servlet创建一个额外的Faces上下文时,它实际上工作了!但只有在测试环境中...当我部署到应用程序引擎时,解决方法不起作用。有什么建议吗?
答案 0 :(得分:1)
您可以通过BeanManager访问CDI bean。您可以将其作为资源注入。然后,您可以从BeanManager获取bean实例。这些bean非常简单,它们只返回一个值来查看它们的类型。
CDI bean:
package x;
import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
@Named( value = "myCDIBean" )
@SessionScoped
public class MyCDIBean implements Serializable
{
private String value = "named";
public MyCDIBean() {}
public String getValue()
{
return value;
}
public void setValue( String value_ )
{
value = value_;
}
}
JSF托管bean:
package x;
import java.io.Serializable;
import javax.annotation.ManagedBean;
import javax.enterprise.context.SessionScoped;
@ManagedBean( value = "myJSFManagedBean" )
@SessionScoped
public class MyJSFManagedBean implements Serializable
{
private String value = "managed";
public MyJSFManagedBean() {}
public String getValue()
{
return value;
}
public void setValue( String value_ )
{
value = value_;
}
}
servlet:
package x;
import java.io.IOException;
import java.io.PrintWriter;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
@WebServlet( urlPatterns ={"/MyServlet"} )
public class MyServlet extends HttpServlet
{
@Resource
BeanManager beanManager;
public static <T> T getBeanInstance( BeanManager bm_, Class<T> class_ )
{
Bean<T> bean = (Bean<T>) bm_.getBeans( class_ ).iterator().next();
CreationalContext<T> ctx = bm_.createCreationalContext( bean );
T object = (T) bm_.getReference(bean, class_, ctx);
return object;
}
protected void processRequest( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException
{
response.setContentType( "text/html;charset=UTF-8" );
try (PrintWriter out = response.getWriter())
{
out.println( "<!DOCTYPE html>" );
out.println( "<html>" );
out.println( "<head>" );
out.println( "<title>Servlet NewServlet</title>" );
out.println( "</head>" );
out.println( "<body>" );
out.println( "<h1>Servlet MyServlet at " + request.getContextPath() + "</h1>" );
MyCDIBean named = getBeanInstance( beanManager, MyCDIBean.class );
out.println( "<p>named bean value: <b>" + named.getValue() + "</b></p>" );
MyJSFManagedBean managed = getBeanInstance( beanManager, MyJSFManagedBean.class );
out.println( "<p>managed bean value: <b>" + managed.getValue() + "</b></p>" );
out.println( "</body>" );
out.println( "</html>" );
}
}