其他servlet可以访问jsf应用程序中的cdi bean吗?

时间:2017-03-25 19:46:42

标签: android google-app-engine jsf

我有一个问题,可能源于我对jsf和面对servlet概念的不理解......我终于得到了我的jsf应用程序在谷歌应用程序引擎上工作。这花了很多时间和一些变通方法,但它已启动并运行:)现在我想使用应用程序中的数据为Android应用程序。没问题,我想,但当然有...我想我可以在jsf应用程序中添加一个额外的servlet并访问我用于网页的相同cdi bean。显然它并不那么容易。当我尝试将bean注入额外的servlet时,它们为null。当我为我的servlet创建一个额外的Faces上下文时,它实际上工作了!但只有在测试环境中...当我部署到应用程序引擎时,解决方法不起作用。有什么建议吗?

1 个答案:

答案 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>" );
    }
  }