相关疑难解决方法(0)

支持bean(@ManagedBean)或CDI Beans(@Named)?

我刚开始阅读Core JavaServer Faces,第3版.他们这样说(强调我的):

对于可以在JSF页面中使用的bean,有两种不同的机制,CDI bean和JSF托管bean,这是一个历史事故.我们建议您使用CDI bean,除非您的应用程序必须在像Tomcat这样的普通servlet运行器上运行.

为什么?他们没有提供任何理由.我一直在使用@ManagedBean在GlassFish 3上运行的原型应用程序中的所有bean,我还没有发现任何问题.我不介意迁移@ManagedBean@Named,但我想知道为什么我应该打扰.

jsf java-ee cdi jsf-2

106
推荐指数
3
解决办法
7万
查看次数

ViewParam vs @ManagedProperty(value ="#{param.id}")

定义View Params之间有什么区别:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

并在ManagedBean中定义属性,如下所示:

@ManagedProperty(value = "#{param.id}")
private Integer id;
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2 managed-bean viewparams managed-property

95
推荐指数
2
解决办法
5万
查看次数

Java EE 6:切换到CDI - 最佳资源

我手头有一个小而完整的Java EE 6应用程序.

传统的注释正在使用: @Resource,@EJB,@Singleton,@PostConstruct,@PreDestroy,@PersistenceContext,@ManagedBean,@ManagedProperty,@RequestScope,@ApplicationScope,...

我想评估是否有必要引入CDI,并标准化依赖注入,bean生命周期管理等的通用策略.

问题:有没有人知道将传统Java EE 6注释转换为CDI注释的好文章,示例或手册?

dependency-injection java-ee cdi java-ee-6

25
推荐指数
1
解决办法
9164
查看次数

CDI缺少@ViewScoped和@FlashScoped

为什么Java EE 6 CDI缺少@ViewScoped和@FlashScoped注释?(特别是前者让我感到奇怪,因为CDI源于Seam世界,它已经知道了非常相似的ScopeType.PAGE ...)

使用CDI时建议的解决方法是什么?使用Seam 3?

谢谢

java seam cdi java-ee-6

6
推荐指数
1
解决办法
3659
查看次数

如何在ManagedBean中注入CDI Bean?

我想在ManagedBean中使用注释@Inject或@Produce注入CDI Bean.我使用的CDI Bean是:

@Named
@Startup
@ApplicationScoped
public class BaseBean {

private List<String> custs;

public List<String> getCusts() {
    return custs;
}

public void setCusts(List<String> emps) {
    this.custs = emps;
}

public BaseBean(){

}

@PostConstruct
void init() {
    custs = new ArrayList<String>();
    custs.add("Cust1");
    custs.add("Cust3");
    custs.add("Cust2");
    custs.add("Cust4");
}

}
Run Code Online (Sandbox Code Playgroud)

我想要注入CDI Bean的ManagedBean是:

@SessionScoped
@ManagedBean
public class Hello implements Serializable {

@Inject
private BaseBean dBean;

private static final long serialVersionUID = 1L;
private List<String> customers;
private List<String> customersSelect;

public Hello() {
}

@PostConstruct
void init() …
Run Code Online (Sandbox Code Playgroud)

jsf ejb java-ee cdi java-ee-6

6
推荐指数
1
解决办法
1万
查看次数

在JSP中注入CDI

在JSP中,可以使用EL表达式(如$ {myBean.myAttribute})来使用CDI托管bean.这里没问题.

我想在JSP文件中使用@Inject的"常规注入"(即不使用EL表达式),例如:<%!@Inject MyBean myBean; %>然后是<%= myBean.getMyAttribute()%>.即使使用EL表达式可以实现该示例,其他一些用例也不能.

这似乎并不完全支持应用程序服务器:
- JBoss 6.0.0,JBoss 6.1.0,Resin 4.0.22:好的,它运行得很好.
- JBoss 7.0.1,GlassFish 3.x(测试了几个版本):FAILS,myBean仍为null.

它应该在JSP中正常工作,因为:
(1)它根据各种相关规范在servlet中正常工作;
(2)JSP在运行时被转换为servlet.

你们知道我想要做的事情是否得到支持?任何内部/实施信息可能?

最好的祝福.

感谢您的时间.

jsp el code-injection java-ee cdi

5
推荐指数
1
解决办法
6862
查看次数

JSF2 - 使用视图范围托管bean在导航之间传递值

我正在解决如何在不使用会话范围托管bean的情况下将值从一个页面传递到另一个页面的问题.对于大多数托管bean,我希望只有Request范围.

我创建了一个非常非常简单的计算器示例,它将来自第5阶段的请求bean(CalculatorRequestBean)上的操作产生的Result对象作为初始化值传递给下一阶段生命周期中初始化的请求bean的新实例.

事实上 - 在生产环境中,我们需要传递更复杂的数据对象,这不像下面定义的结果那样原始.

您对此解决方案的看法是什么,它考虑了两种可能性 - 我们保持相同的观点或者我们导航到新的观点.但在这两种情况下,我都可以使用视图范围的托管bean获取传递的先前值.

计算器页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Calculator</title>
</h:head>
<h:body>
    <h:form>
        <h:panelGrid columns="2">
            <h:outputText value="Value to use:"/>
            <h:inputText value="#{calculatorBeanRequest.valueToAdd}"/>

            <h:outputText value="Navigate to new view:"/>
            <h:selectBooleanCheckbox value="#{calculatorBeanRequest.navigateToNewView}"/>

            <h:commandButton value="Add" action="#{calculatorBeanRequest.add}"/>
            <h:commandButton value="Subtract" action="#{calculatorBeanRequest.subtract}"/>

            <h:outputText value="Result:"/>
            <h:outputText value="#{calculatorBeanRequest.result.value}"/>

            <h:commandButton value="Calculator2" action="calculator2"/>

            <h:outputText value="DUMMY" rendered="#{resultBeanView.dummy}"/>
        </h:panelGrid>
    </h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)

带有运算乘法和除法的Calculator2页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" …
Run Code Online (Sandbox Code Playgroud)

java jsf jsf-2

4
推荐指数
1
解决办法
3万
查看次数

获取GET请求参数到@ViewScoped bean

我有一个(请求范围的)列表,用户可以从中选择"PQ"(链接列表).单击或以其他方式输入浏览器时,将显示每个PQ的主页面.每个PQ的页面都是表格

http://localhost:8080/projectname/main.jsf?id=2

这是PQ bean的第一个:

@Named
@ViewScoped
public class PqHome implements Serializable
{
    @PersistenceContext(unitName="...")
    private EntityManager em;

    private Integer id;
    private PQ instance;

    @PostConstruct
    public void init()
    {
        System.out.println("ID is " + id); // ID from URL param

        instance = em.find(PQ.class, id);       
    }

    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id = id;
    }

    public PQ getInstance()
    {
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是main.xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                ...>
  <ui:define name="metadata">
    <f:metadata>
      <f:viewParam name="id" value="#{pqHome.id}">
        <f:convertNumber integerOnly="#{true}" />
      </f:viewParam> …
Run Code Online (Sandbox Code Playgroud)

java javabeans cdi scopes jsf-2

3
推荐指数
2
解决办法
8810
查看次数

在JBoss AS7堆栈上使用ViewScope和避免LazyInitializationException的最简单方法(JSF2,CDI,JPA2,Seam?)

我正在尝试建立一个基于JBoss AS7的Web应用程序堆栈,用于满足以下要求的小规模研究原型和学生项目:

  1. 我想使用与Ajax相关的范围,例如ViewScope - 或者可能是MyFaces Orchestra中的(View)AccessScope - 用于我的托管bean,以及PrimeFaces组件.

  2. 基于JPA的持久性应该相当简单,无需处理OpenSessionInView模式等.我对JPA2的主要问题是可怕的LazyInitializationException,尤其是在AJAX调用中.我要求在谈话手动控制.

  3. 我希望尽可能少地使用依赖项,因此主要依赖于JBoss AS7附带的内容.

现在,我已经建立了一个项目,其中包含以下(主要是提供的)Maven依赖项:

  • CDI
  • 冬眠-2.0-API
  • 的jboss-EJB-api_3.1_spec
  • 的jboss-JSF的api_2.1_spec
  • JBoss的数据注解,api_1.1_spec
  • PrimeFaces 3

到目前为止看起来相当苗条.缺少的是对JSF特定范围的进一步支持,并且当在JSF页面中迭代集合时,我总是得到一个LazyInitializationException.现在,我的持久性服务类看起来像这样:

import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;

@Stateful @RequestScoped
public class TestEntityService implements Serializable {
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    // ... some methods working with the entityManager ...
}
Run Code Online (Sandbox Code Playgroud)

和我的ResourceFactory bean:

public class ResourceFactory {
    @Produces @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;
}
Run Code Online (Sandbox Code Playgroud)

我尝试过失败与组合@Named代替@Stateful@SessionScoped代替@RequestScoped.然而,我发现添加Seam 3 Persistence,Solder&Faces模块似乎可以解决我的大多数问题,但这会为我的项目增加大量的新依赖项(例如,seam-security,prettyfaces,drools,joda-time和其他依赖项) ).

我的问题是: …

cdi seam3 jsf-2 jpa-2.0 jboss7.x

3
推荐指数
1
解决办法
4496
查看次数

@Named的行为与@ManagedBean不同

我目前正在将一个项目从JBoss 4.2.2迁移到JBoss 6.0.0,我还在使用CDI添加依赖注入,并从JSF 1.2迁移到JSF 2.0.我将一个beans.xml文件添加到ejb-package以及war-package中.

现在我有一个使用托管bean的xhtml页面LoginBean.java.已经在faces-config.xml中配置了bean,如下所示:

<managed-bean>
    <description>Sample description</description>
    <managed-bean-name>loginBean</managed-bean-name>
    <managed-bean-class>com.sample.managedbeans.LoginBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)

所以,首先我删除了上面的配置并添加@ManagedBean @SessionScoped到类本身.因为我想CDI添加到项目中,我改变了@ManagedBean@Named(与质疑2930889).

现在,当我提交相应xhtml的表单时,字段usernamepassword(在JSP中使用#{loginBean.username})为null.当我改回来时@ManagedBean,它工作正常.

我在这里错过了什么吗?

亲切的问候,塞巴斯蒂安

java jsf cdi

2
推荐指数
1
解决办法
517
查看次数

ViewScoped就像RequestScoped一样 - 为什么?

我编写了一个ViewScoped Managed-Bean,每当我在webbrowser中刷新页面时,Managed-Bean似乎都被重新创建,文章为null,它会加载一个新的文章对象,依此类推.对我来说,它看起来与RequestScoped的行为相同.

我将Eclipse IDE用于Java EE开发人员,最新的JDK,Apache Tomcat 7.0.8和Mojarra 2.0.3.

怎么了?

托管bean:

...
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
...
@ManagedBean
@ViewScoped
public class CreateArticle {

    @ManagedProperty(value = "#{index.facade}")
    private PersistenceFacade facade;
    private Article article;
    private Vector<ArtCategory> artcat;

    public CreateArticle() {
        artcat = ArtCategory.listArtCat();
    }

    @PostConstruct
    public void postCreateArticle() {
        if (article == null) {
            try {
                article = facade.createArticle();
            } catch (DAOException e) {
                e.printStackTrace();
            }
        }
    }

    public void setFacade(PersistenceFacade facade) {
        this.facade = …
Run Code Online (Sandbox Code Playgroud)

java jsf facelets jsf-2

1
推荐指数
1
解决办法
2296
查看次数