2015-09-02 4 views
0

Позвольте мне рассказать вам свою историю, и между ними задам вопросы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 должна выполняться весной? Я думаю, что это как-то избыточно

+0

очень личное мнение, что весна в последних версиях Java EE бесполезно. Он заменяется CDI для IoC. Работа с двумя контейнерами, пытающимися достичь того же, - пустая трата времени. Для данных Spring вы можете использовать дельта-шип (модуль данных), который представляет собой набор переносных расширений CDI. К сожалению, вам приходится работать с JSF, который я считаю единственным слабым кирпичом в текущем комплекте JEE. Я лично заменил это на комбинацию JAX-RS & AngularJs. – Franck

+0

У меня действительно Весна есть некоторые преимущества перед CDI. Насколько я знаю, транзакционная транзакция не реализована в CDI – Deibys

+0

Пожалуйста, задайте один вопрос на вопрос. Что касается управления транзакциями, эта часть выполняется 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

ответ

0

Разве это не рекомендуется использовать старые аннотации JSF?

Это правда. В JSF мы отходим от родных бобов JSF и инъекций в пользу CDI. Хотя все еще официально не указано, @ManagedBean и друзья должны считаться эффективно устаревшими.

@ViewScoped должен работать нормально с CDI, но убедитесь, что вы импортируете правильный. Старый не работает, чем он работает.Один вам нужно:

javax.faces.view.ViewScoped

См CDI compatible @ViewScoped

 Смежные вопросы

  • Нет связанных вопросов^_^