2014-10-13 3 views
0

Я начинаю проект с CDI с помощью сварки, и я получаю следующее сообщение об ошибке при попытке введения:Проблемы с КДИ - (Weld + TomCat7 + JSF)

@Inject 
private UserRepository repository; 

консоли:

INFO: Starting Servlet Engine: Apache Tomcat/7.0.12 
13:16:22,859 INFO servletWeldServlet:57 - WELD-ENV-001008: Initialize Weld using ServletContainerInitializer 
13:16:22,875 INFO Version:151 - WELD-000900: 2.2.5 (Final) 
13:16:22,906 INFO Bootstrap:206 - WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously. 
13:16:22,937 WARN Interceptor:47 - WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled 
13:16:22,937 WARN Interceptor:47 - WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled 
13:16:23,046 INFO servletTomcat:45 - WELD-ENV-001100: Tomcat 7+ detected, CDI injection will be available in Servlets, Filters and Listeners. 
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type UserRepository with qualifiers @Default 
    at injection point [BackedAnnotatedField] @Inject private br.com.controllers.UserController.repository 
    at br.com.controllers.UserController.repository(UserController.java:0) 

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:372) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:293) 
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:167) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:531) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 

EntityManagerFactory.java

package br.com.util; 

import javax.enterprise.inject.Disposes; 
import javax.enterprise.inject.Produces; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

public class EntityManagerFactory { 

    @PersistenceContext(unitName="default") 
    private EntityManager em; 

    @Produces 
    public EntityManager create() { 
     return em; 
    } 

    public void close(@Disposes EntityManager em) { 
     em.close(); 
    } 

} 

Repository.java

import java.io.Serializable; 
import java.lang.reflect.ParameterizedType; 
import java.util.List; 

import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.persistence.TypedQuery; 

public abstract class Repository<T, I extends Serializable> { 


    @Inject 
    protected final EntityManager entityManager; 
    protected final Class<T> clazz; 

    protected Repository(EntityManager entityManager) { 

     this.entityManager = entityManager; 
     @SuppressWarnings("unchecked") 
     Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     this.clazz = clazz; 

    } 

    public void refresh(T entity){ 
     entityManager.refresh(entity); 
    } 

    public void create(T entity) { 
     entityManager.persist(entity); 
    } 

    public T update(T entity) { 
     return entityManager.merge(entity); 
    } 

    public void destroy(T entity) { 
     entityManager.remove(entity); 
    } 

    public T find(I id) { 
     return entityManager.find(clazz, id); 
    } 

    public List<T> findAll() { 

     TypedQuery<T> query = entityManager.createQuery("FROM " + clazz.getName() ,clazz);  
     List<T> resultList = query.getResultList(); 
     return resultList;  
    } 



} 

UserRepositoryImpl.java

package br.com.repositories; 


import javax.persistence.EntityManager; 
import javax.transaction.Transactional; 

import br.com.models.User; 


@Transactional 
public class UserRepositoryImpl extends Repository<User, Long >implements UserRepository { 

    protected UserRepositoryImpl(EntityManager entityManager) { 
     super(entityManager); 
    } 


} 

UserController.java

package br.com.controllers; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import br.com.repositories.UserRepository; 



@Named("userController") 
@RequestScoped 
public class UserController { 

    @Inject 
    private UserRepository repository; 

    UserController(){ 

    } 

    @PostConstruct 
    public void init(){ 
     System.out.println("started"); 
    } 

    public String getMessage(){ 
     return "test"; 
    } 

    public void create(){ 
     System.out.println("test method"); 
    } 

} 

META-INF/beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
          http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="all"> 

</beans> 

META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
<Manager pathname=""/> <!-- disables storage of sessions across restarts --> 
<Resource name="BeanManager" 
auth="Container" 
type="javax.enterprise.inject.spi.BeanManager" 
factory="org.jboss.weld.resources.ManagerObjectFactory"/> 
</Context> 

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
     <display-name>wochenbericht</display-name> 

    <welcome-file-list> 
     <welcome-file>index.jsf</welcome-file> 
     </welcome-file-list> 

     <!-- CDI - WELD --> 
     <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
     </listener> 

     <resource-env-ref> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
      <resource-env-ref-type> 
       javax.enterprise.inject.spi.BeanManager 
      </resource-env-ref-type> 
     </resource-env-ref> 


     <!-- JSF --> 
     <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
     </servlet> 
     <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
     </servlet-mapping> 


     <!-- SESSION TIMEOUT --> 
     <session-config> 
     <session-timeout>30</session-timeout> 
     </session-config> 

     <!-- CONTEXT LOCAL --> 
     <context-param> 
      <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
      <param-value>client</param-value> 
     </context-param> 

     <context-param> 
      <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name> 
      <param-value>2</param-value> 
     </context-param> 

     <context-param> 
     <param-name>javax.faces.WEBAPP_RESOURCES_DIRECTORY</param-name> 
     <param-value>/assets</param-value> 
     </context-param> 

     <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
     </context-param> 

     <!-- SECURITY SETTINGS --> 
     <security-constraint> 
     <display-name>Restrict direct access to XHTML files</display-name> 
     <web-resource-collection> 
      <web-resource-name>XHTML files</web-resource-name> 
      <url-pattern>*.xhtml</url-pattern> 
     </web-resource-collection> 
     <auth-constraint /> 
     </security-constraint> 

Мои Libs:

antlr-2.7.7.jar 
aopalliance.jar 
c3p0-0.9.1.jar 
cdi-api-1.1.jar 
dom4j-1.6.1.jar 
EasyCriteria-3.1.0.jar 
hibernate-c3p0-4.3.6.Final.jar 
hibernate-commons-annotations-4.0.5.Final.jar 
hibernate-core-4.3.6.Final.jar 
hibernate-entitymanager-4.3.5.Final.jar 
hibernate-jpa-2.1-api-1.0.0.Final.jar 
hibernate-validator-4.3.0.Final.jar 
javassist-3.18.1-GA.jar 
javax.inject.jar 
jboss-logging-3.1.3.GA.jar 
jboss-logging-annotations-1.2.0.Beta1.jar 
jboss-transaction-api_1.2_spec-1.0.0.Final.jar 
jsf-api-2.2.8.jar 
jsf-impl-2.2.8.jar 
log4j-1.2.16.jar 
postgresql-9.2-1003.jdbc4.jar 
slf4j-api-1.6.6.jar 
slf4j-jdk14-1.6.6.jar 
slf4j-log4j12-1.6.1.jar 
validation-api-1.0.0.GA.jar 
weld-se-core-2.2.5.Final.jar 
weld-servlet-2.2.5.Final.jar 
weld-servlet-core-2.2.5.Final.jar 

Может ли кто-нибудь мне помочь? Спасибо!

ответ

1

Ваша первая проблема заключается в том, что класс UserRepositoryImpl не имеет конструктора по умолчанию (пустой), а также есть метод @Produces, поэтому нет возможности его создать. Удалить EntityManager entityManager от конструкторов от Repository и UserRepositoryImpl классов.
Изменить конструктор в Repository для:

protected Repository() { 

    /// this.entityManager = entityManager; // <= this is already injected by 
              // @Inject protected final EntityManager entityManager; 
    @SuppressWarnings("unchecked") 
    Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    this.clazz = clazz; 
} 

Ваша вторая проблема будет неправильной инъекции PersistenceContext. Вы либо должны использовать EJB (впрыснуть EntityManager через @PersistenceContext) или веб-модули используют:

@PersistenceUnit(unitName="default") 
EntityManagerFactory emf; 
... 
EntityManager em = emf.createEntityManager(); 

И ваша третья проблема будет транзакции - снова вам необходимо либо переключиться на EJB, или обрабатывать транзакции в то время как сохраняющиеся ваши бобы ,

Я рекомендую сначала прочитать следующее перед кодированием:

0

@Gas Спасибо вам за отзывы и ссылки, теперь работает, я не знаю, если это лучший способ:

UserRepositoryImpl

package br.com.repositories; 

import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.transaction.Transactional; 
import br.com.models.User; 

@Transactional 
public class UserRepositoryImpl extends Repository<User, Long >implements UserRepository { 


    @Inject 
    protected UserRepositoryImpl(EntityManager entityManager) { 
     super(entityManager); 
    } 


} 

Repository

package br.com.repositories; 

import java.io.Serializable; 
import java.lang.reflect.ParameterizedType; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.TypedQuery; 

public abstract class Repository<T, I extends Serializable> { 

    protected final EntityManager entityManager; 
    protected final Class<T> clazz; 

    protected Repository(EntityManager entityManager) { 
     this.entityManager = entityManager; 
     @SuppressWarnings("unchecked") 
     Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     this.clazz = clazz; 
    } 

    public void refresh(T entity){ 
     entityManager.refresh(entity); 
    } 

    public void create(T entity) { 
     entityManager.persist(entity); 
    } 

    public T update(T entity) { 
     return entityManager.merge(entity); 
    } 

    public void destroy(T entity) { 
     entityManager.remove(entity); 
    } 

    public T find(I id) { 
     return entityManager.find(clazz, id); 
    } 

    public List<T> findAll() { 
     TypedQuery<T> query = entityManager.createQuery("FROM " + clazz.getName() ,clazz);  
     return query.getResultList(); 
    } 

} 

EntityManagerProducer

package br.com.util; 

import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.context.RequestScoped; 
import javax.enterprise.inject.Disposes; 
import javax.enterprise.inject.Produces; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

@ApplicationScoped 
public class EntityManagerProducer { 

    private EntityManagerFactory factory; 

    public EntityManagerProducer() { 
     factory = Persistence.createEntityManagerFactory("default"); 
    } 

    @Produces @RequestScoped 
    public EntityManager createEntityManager() { 
     return factory.createEntityManager(); 
    } 

    public void closeEntityManager(@Disposes EntityManager manager) { 
     manager.close(); 
    } 

} 

UserController

package br.com.vw.controllers; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import br.com.models.User; 
import br.com.repositories.UserRepository; 



@Named("userController") 
@RequestScoped 
public class UserController { 

    @Inject UserRepository userRepository; 

    UserController(){ 

    } 

    @PostConstruct 
    public void init(){ 
     System.out.println("Inicialilizado o construtor"); 
    } 

    public String getMessage(){ 
     return "Conteúdo da mensagem"; 
    } 

    public void create(){ 

     System.out.println("Método create disparado"); 

     User user = new User(); 
      user.setEmail("[email protected]"); 
      user.setName("Marcos de Freitas"); 

     userRepository.create(user); 


    } 

} 

Tks