Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring data JSF2+Spring4+CDI+Spring数据,匹配得好吗?_Spring Data_Cdi_Jsf 2.2_Spring 4 - Fatal编程技术网

Spring data JSF2+Spring4+CDI+Spring数据,匹配得好吗?

Spring data JSF2+Spring4+CDI+Spring数据,匹配得好吗?,spring-data,cdi,jsf-2.2,spring-4,Spring Data,Cdi,Jsf 2.2,Spring 4,让我告诉你我的故事,其间我会问一些问题 我在一个项目中工作,我必须使用JSF,实际上没有其他选择。 在过去的几年里,我来自奇妙的Spring世界,我真的很想使用一些特性,比如Spring数据、Spring单例bean、Autowire bean到其他bean中,等等 所以我最初认为一切都会很顺利,JSF支持bean将由CDI容器和@Service管理,@Respostory以及数据库连接实体管理器由spring容器管理。我想让我的应用程序独立于JavaEE容器,但我使用的只是Wildfly 9。

让我告诉你我的故事,其间我会问一些问题

我在一个项目中工作,我必须使用JSF,实际上没有其他选择。 在过去的几年里,我来自奇妙的Spring世界,我真的很想使用一些特性,比如Spring数据、Spring单例bean、Autowire bean到其他bean中,等等

所以我最初认为一切都会很顺利,JSF支持bean将由CDI容器和@Service管理,@Respostory以及数据库连接实体管理器由spring容器管理。我想让我的应用程序独立于JavaEE容器,但我使用的只是Wildfly 9。在Wildfly中,我创建了到oracle数据库的数据源连接,以便稍后绑定到我的应用程序

所以我的第一个困难是,几年前,我编写了一些JSF代码,我知道@ManagedBean anotations和JSF作用域,尽管所有这些都没有改变,但似乎还有另一种说法,根据我读到的内容,建议使用@Named等CDI注释,而不是JSF注释。所以我想遵循这些建议,并以某种方式迫使我将CDI容器引入我的应用程序

第一个问题:这是真的吗?不建议使用旧的JSF注释吗

我的JSF bean如下所示:

import java.io.Serializable;
import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.validation.constraints.NotNull;

import co.com.psl.connectnetwork.service.AuthenticationService;
import lombok.Data;


@Named
@SessionScoped
@Data
public class LoginBean implements Serializable {
}
我的第一个问题是,正如我前面提到的,我想介绍Spring,所以我在我的应用程序上下文xml文件中

<context:annotation-config />
<context:component-scan base-package="co.com.package" />
所以我在做互联网研究,我包括:

persistence.xml CdiConfig类 persistence.xml的内容是: http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd 版本=2.1>

<persistence-unit name="persistenceUnit">
        <class>co.com.entityClass1</class>
    <class>co.com.entityClass2</class>
    <jta-data-source>java:/jndi-string</jta-data-source>
    <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
        </properties>
</persistence-unit>

</persistence>
第五个问题:有人能告诉我为什么需要这样做吗?spring不应该将enntityManager注入@Repository spring bean吗?为什么需要persistence.xml?为什么向@Repository Spring bean的注入似乎必须由Spring完成?我认为这是多余的

不建议使用旧的JSF注释吗

没错。在JSF中,我们正在从JSF本地bean和注入转向CDI。尽管官方还没有这样做,@ManagedBean和friends应该被认为是不推荐的

@ViewScoped应该可以与CDI配合使用,但请确保导入的是正确的。旧的坏了,新的坏了。您需要的是:

javax.faces.view.ViewScoped


参见

一个非常个人化的观点是,最新版本的JavaEE中的Spring是无用的。它被国际奥委会的CDI所取代。处理两个容器试图实现相同的目标是浪费时间。对于Spring数据,您可以使用delta spike数据模块,这是一组CDI便携式扩展。不幸的是,你必须和JSF一起工作,我认为这是目前Jee捆绑中唯一的薄弱环节。我个人用JAX-RS和AngularJs的组合替换了这个。我真的认为Spring比CDI有一些优势。据我所知,CDI中没有实现事务性。请每个问题问一个问题。至于事务管理,这部分由EJB+JTA完成。Spring竞争JavaEECDI、EJB、JTA、JSF等,而不仅仅是CDI。这里有一些相关的/重复的问题已经单独询问和回答:,,还有pojo事务,一般来说:您不应该将Spring容器与CDI容器混用。两个DI被认为是有害的。Spring数据本身具有CDI支持,因此不需要维护额外的Spring上下文。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">

<bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/jndi-spring"/>
    <property name="lookupOnStartup" value="true"/>
    <property name="proxyInterface" value="javax.sql.DataSource"/>
</bean>
<!-- <jee:jndi-lookup id="datasource" jndi-name="java:/ConnectNetworkDS"/> -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="datasource" />
    <property name="persistenceUnitName" value="persistenceUnit2" />
    <property name="packagesToScan" value="co.com.packagestoscan" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>

    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
        </props>
    </property>
</bean>
<jpa:repositories base-package="co.com.packagewhererepositoriearelocated"  />
</beans>
<jpa:repositories base-package="co.com.packagewhererepositoriearelocated"  />
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.deployment.unit."deployedwar.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."deployedwar.war".WeldStartService: Failed to start service
<persistence-unit name="persistenceUnit">
        <class>co.com.entityClass1</class>
    <class>co.com.entityClass2</class>
    <jta-data-source>java:/jndi-string</jta-data-source>
    <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
        </properties>
</persistence-unit>

</persistence>
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class CdiConfig {  

    @Produces  
    @Dependent  
    @PersistenceContext  
    private EntityManager entityManager;

}