Позвольте мне рассказать вам свою историю, и между ними задам вопросыJSF2 + Весна 4 + CDI + Весна Данные, хорошая совпадение?
Я работаю в проекте, мне нужно использовать JSF, на самом деле нет другого выбора. Исходя из чудесного весеннего мира в последние годы, я действительно хотел использовать некоторые функции, такие как Spring Data, Spring Singleton beans, Autowire beans в другие бобы и т. Д.
Итак, я думал, что сначала все будет плавным, JSF (backing beans) будет управляться контейнером CDI и @Service, @Respostory и подключением к базе данных. Управление сущностью по весеннему контейнеру. Я хочу сделать свое приложение независимым от контейнера Java EE, но только для информации я использую Wildfly 9. В Wildfly я создаю источник данных (соединение с базой данных оракула) для привязки позже к моему приложению.
Итак, моя первая проблема заключалась в том, что несколько лет назад я кодировал некоторые JSF, и я знал о аномалиях @ManagedBean и объектах JSF, несмотря на то, что они не изменились, похоже, есть еще один подход, и в соответствии с тем, что я читал рекомендуется использовать @Named и т. д. (аннотации CDI) вместо аннотаций JSF. Поэтому я хотел следовать этим советам и каким-то образом заставлял меня вводить контейнер CDI в мое приложение.
1-й вопрос: Это правда? Разве это не рекомендуется использовать старые аннотации JSF?
Моей JSF фасоли выглядеть следующим образом:
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 {
}
Моим первым вопросом, является то, что, как я уже говорил раньше, я хотел бы представить весной, так что я имел в моем файле контекст XML-приложений
<context:annotation-config />
<context:component-scan base-package="co.com.package" />
Это вызывало у меня проблемы, потому что казалось, что Spring проверила мои управляемые бобы JSF и рассматривала их как весенние бобы, и у меня нет никаких проблем с этим, но на практике эти бобы были одиночными! , так ужасно для приложения, которое управляет некоторым состоянием среди зарегистрированных пользователей.
Так что я решил его за счет исключения JSF фасоли из пружинной контейнера, я его, вводя это:
<context:component-scan base-package="co.com.scannedpackage" >
<context:exclude-filter type="regex" expression="co.excludedpackage.*Bean" />
</context:component-scan>
Так это не казалось мне так страшно, и, как представляется, некоторые imcompatibility я хотя Лучше, чтобы весна JSF не управлялась весной.
2-й вопрос: Вы согласны?
Как я уже сказал, у меня будут некоторые bean-компоненты @Service (Spring annotations), которые мне в конечном итоге придется вводить в управляемые бобы JSF. Первоначально я использовал @Inject для вставки компонента службы в компонент JSF, и он работал отлично, единственная проблема заключается в том, что когда JSF-компонент использовал javax.enterprise.context.SessionScoped, он заставлял все атрибуты быть Serializable, поэтому я сделал @Service Spring bean реализует интерфейс Serializable, который я не считаю хорошим, даже если он работает, мне кажется, что противоречие и весна singleton bean (stateless) вынуждена быть сериализована. Поэтому я попытался использовать @Autowired anotation в управляемом компоненте JSF, но компонент не был введен, и я получил нулевую ссылку. В основном я предполагаю ошибку, я думаю, что это было, использовать @Autowired в bean, который не управляется весной.
3-й вопрос: Как я могу заставить его работать? Я действительно думаю, что лучше использовать @Autowired, чем иметь сериализуемые весенние бобы.Если компонент ApplicationScope/viewScope/SessionScope JSF пассивирован, будет ли снова добавлен компонент Spring? », Я так не думаю. Если используется @ManagedBean, будет ли он работать?
Другой вопрос, который я имею, что если мои JSF бобы управляются КДИ, кажется, что javax.faces.bean.ViewScoped не очень хорошо работает с КДИ
4-й вопрос: Является ли это так? Вы рекомендуете мне использовать @ManagedBean вместо @Named? Если я использую @ManagedBean, как я могу добавить зависимости Spring? Есть ли какая-либо другая область CDI, которую я мог бы использовать вместо ViewScoped?
Теперь, переходя от JSF к весне, я действительно хочу использовать Spring в своих приложениях, такие как Spring-Data, Spring-Security и другие, преимущества Spring Singleton beans над EJB безгражданскими бобами - это вещи, я хочу пропустить. В моем приложении у меня будет источник данных, созданный на сервере Java EE или контейнере Java EE. Затем я буду связывать этот источник данных внутри моего приложения. Так что в моем applicationContext.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.stereotype.Repository .Resository
К сожалению, когда я раскрываю мое приложение, я получаю:
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
Содержание persistence.xml является: http://xmlns.jcp .org/XML/нс/сохранение/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>
И 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;
}
пятые Вопрос: Может ли кто-нибудь пожалуйста, скажите мне, почему это необходимо? Должна ли весна быть в состоянии ввести enntityManager в @Repository Spring beans? Почему необходим persistence.xml? Почему кажется, что инъекция в @Repository Spring beans должна выполняться весной? Я думаю, что это как-то избыточно
очень личное мнение, что весна в последних версиях Java EE бесполезно. Он заменяется CDI для IoC. Работа с двумя контейнерами, пытающимися достичь того же, - пустая трата времени. Для данных Spring вы можете использовать дельта-шип (модуль данных), который представляет собой набор переносных расширений CDI. К сожалению, вам приходится работать с JSF, который я считаю единственным слабым кирпичом в текущем комплекте JEE. Я лично заменил это на комбинацию JAX-RS & AngularJs. – Franck
У меня действительно Весна есть некоторые преимущества перед CDI. Насколько я знаю, транзакционная транзакция не реализована в CDI – Deibys
Пожалуйста, задайте один вопрос на вопрос. Что касается управления транзакциями, эта часть выполняется EJB + JTA. Весна конкурирует с Java EE (CDI, EJB, JTA, JSF и т. Д.), А не только CDI. Вот некоторые связанные/повторяющиеся вопросы, которые уже заданы индивидуально и ответили: http://stackoverflow.com/q/18369356, http://stackoverflow.com/a/4347707, http://stackoverflow.com/q/18387993, http : //stackoverflow.com/q/30639785 – BalusC