当前位置: 首页 > 知识库问答 >
问题:

JSF2 Spring 4 CDI Spring Data,好匹配吗?

太叔栋
2023-03-14

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

我在一个项目中工作,我必须使用JSF,没有其他选择。来自过去几年精彩的Spring世界,我真的很想使用一些功能,如Spring数据、Spring单例bean、自动连接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" />

这给我带来了问题,因为Spring似乎扫描了我的JSF管理bean,并将它们作为Spring bean处理,我对此没有任何问题,但实际上这些bean是单例的,对于一个管理登录用户状态的应用程序来说,这太可怕了。

所以我通过从spring容器中排除JSF bean来解决这个问题,我通过引入以下内容来解决:

<context:component-scan base-package="co.com.scannedpackage" >
    <context:exclude-filter type="regex" expression="co.excludedpackage.*Bean"  />
</context:component-scan>

因此,在我看来,这并没有那么糟糕,而且似乎存在一些不兼容性,我认为最好不要让Spring来管理JSFbean。

第二个问题:你同意吗?

正如我所说的,我将有一些@Service(Spring注释)bean,我最终将不得不将它们注入JSF管理的bean中。最初我使用@Inject将服务bean注入到JSF bean中,它工作得很好,唯一的问题是当JSF bean使用javax.enterprise.context.SessionScoped时,它强制所有属性都是可序列化的,所以我制作了@ServiceSpring bean实现了可序列化接口,我不认为它是好的,即使它工作,在我看来,它似乎是一个矛盾和一个Spring单例bean(无状态)被迫序列化。所以我试图在JSF管理的bean中使用@autowed anotation,但是bean没有被注入,我得到了一个空引用。基本上,我想我认为错误是,在一个不被Spring管理的bean中使用@autowmed。

第三个问题:我怎样才能让它工作?我真的认为使用@Autowired比让Springbeans可序列化要好。如果ApplicationScope/viewScope/SessionScope JSF bean被钝化,Spring bean会再次注入吗?,我不这么认为。如果使用@ManagedBean,它会工作吗?

我面临的另一个问题是,如果我的JSFbean由CDI管理,那么javax似乎是。面孔。豆ViewScoped不能很好地与CDI配合使用

第四个问题:是这样吗?你建议我使用@ManagedBean而不是@Named吗?如果使用@ManagedBean,如何注入Spring依赖项?有没有其他CDI作用域可以替代ViewScope?

现在从JSF转到Spring,我真的想在我的应用程序中使用Spring,Spring数据、Spring Security性等特性,Spring单例bean优于EJB无状态bean,这些都是我不想错过的。在我的应用程序中,我将在JavaEE服务器或JavaEE容器中创建一个数据源。然后,我将在应用程序内部绑定该数据源。所以在我的应用环境中。xml,我有:

<?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>

请注意,我使用的是Spring数据和这条线

<jpa:repositories base-package="co.com.packagewhererepositoriearelocated"  />

表示用@org注释的接口。springframework。刻板印象存储库。解决的

不幸的是,当我部署应用程序时,我得到:

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.xml
  • CdiConfig类

坚持的内容。xml是:http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd“version=“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>

和CdiConfig类:

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;

}

第五个问题:有人能告诉我为什么需要这样做吗?spring不应该将enntityManager注入@Repository spring beans吗?为什么是坚持。xml是必要的吗?为什么对@Repository Spring bean的注入似乎必须在Spring之前完成?我觉得这是多余的

共有1个答案

牛景同
2023-03-14

不建议使用旧的JSF注释吗?

没错。在JSF中,我们正在从JSF原生bean和注入转向CDI。虽然官方还没有这样做,@ManagedBean和朋友应该被视为不推荐使用。

@ViewScoped应该可以很好地使用CDI,但是要确保导入的是正确的。旧的不起作用,新的起作用。您需要的是:

javax.faces.view.查看范围

请参阅CDI compatible@ViewScoped

 类似资料:
  • 我和ElasticSearch一起工作。当我执行此查询时: 我得到了我想要的(所有的结果,其中有参考黑莓,但不是Q10)。 但是,我想限制搜索的字段只限于“title”字段。例如,_source文档有标题、正文、标签等,我只想搜索标题。ElasticSearch“匹配”似乎很适合我... 虽然这只成功地搜索了标题,但它仍然返回标题中带有Q10的结果,这与上面的搜索不同。 我正在看比赛文档,但似乎不

  • 本节描述在消费者端测试时可以使用的各种不同的请求/响应匹配技术。注意,以下演示的例子使用的是Ruby DSL,因为各种实现有所不同,请参考自己所使用的特定语言和框架。 注意 如果在消费者端编写测试时所使用的语言与提供者端不同,必须确保两者使用的是共同的Pact规范,否则就无法进行验证。 正则表达式 有时请求或响应中的某些键值是事先无法知道的——比如时间戳或者生成的ID。 你所需要的是能够以某种方式

  • 一个简单的if/else往往是不够的,因为你可能有两个或更多个选项。这样else也会变得异常复杂。Rust 有一个match关键字,它可以让你有效的取代复杂的if/else组。看看下面的代码: let x = 5; match x { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"),

  • 我可以使用哪种匹配器? { test: /\.js$/, loader: 'babel-loader' } - Matches just .js { test: /\.(js|jsx)$/, loader: 'babel-loader' } - Matches both js and jsx Generally put it's just a JavaScript regex so standar

  • 本文向大家介绍java模式匹配之蛮力匹配,包括了java模式匹配之蛮力匹配的使用技巧和注意事项,需要的朋友参考一下 java模式匹配之蛮力匹配 使用示例: 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 问题内容: 我正在尝试匹配模式: 以下仅匹配第一次出现的情况: 结果是: 但是,[使用pythex似乎可以正常工作](http://pythex.org/?regex=%3C–(%5B%5Cw%5Cs%5D%2B)–%3E(%5B%5Cs%5CS%5D*%3F)(%3F%3D%5Cn%3C–%7C%24)&test_string=%3C–%20Option%201%20–%3E%0ANice%20