I'm starting a project with CDI using weld, and am getting the following error when I try to injection:
#Inject
private UserRepository repository;
Console:
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>
My 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
Can anyone help me? thank you!
Your first problem is that UserRepositoryImpl class doesn't have default (empty) constructor, and nither there is #Produces method, so there is no way to instantiate it. Remove EntityManager entityManager from constructors from Repository and UserRepositoryImpl classes.
Change the constructor in Repository to:
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;
}
Your second problem will be incorrect injection of PersistenceContext. You either need to use EJB (to inject EntityManager via #PersistenceContext) or for web modules use:
#PersistenceUnit(unitName="default")
EntityManagerFactory emf;
...
EntityManager em = emf.createEntityManager();
And your third problem will be transactions - again you either need to switch to EJB, or handle transactions while persisting your beans.
I'd recommend first read the following before coding:
CDI documentation
Contexts and Dependency Injection for Java EE (Tutorial)
JPA (Tutorial)
Managing Entities
#Gas Thanks for you feedback and links, now works, I do not know if it's the best way:
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#uol.com.br");
user.setName("Marcos de Freitas");
userRepository.create(user);
}
}
Tks
Related
I'm trying to wire JERSEY rest services with Spring and i'm facing this exception.
PodcastResource
package com.integration.messenger.resources;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.integration.messenger.model.Podcast;
import com.integration.messenger.service.PodcastService;
#Path("/podcasts")
#Component
public class PodcastResource {
#Autowired
PodcastService podcastService;
#GET
#Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<Podcast> getPodcasts(){
return podcastService.getAllPodcasts();
}
/*#GET
#Produces({ MediaType.APPLICATION_JSON})
public String getMessage(){
return "Helooo";
}*/
}
PodcastService
package com.integration.messenger.service;
import java.util.List;
import com.integration.messenger.model.Podcast;
public interface PodcastService {
List<Podcast> getAllPodcasts();
}
PodcastServiceImp
package com.integration.messenger.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.integration.messenger.model.Podcast;
import com.integration.messenger.repository.PodcastRepository;
#Service("podcastService")
public class PodcastServiceImp implements PodcastService {
#Autowired
PodcastRepository podcastRepository;
private Map<Long, Podcast> podcasts = podcastRepository.getPodcasts();
public PodcastServiceImp() {
podcasts.put(1L, new Podcast(1, "Hello World News", "How to Programme", "www.podcastpedia.com/How to Programme", "Programme"));
podcasts.put(2L, new Podcast(2, "Hello Jersey News", "Restfull Implementation", "www.podcastpedia.com/Restfull Implementation", "Restfull"));
}
public List<Podcast> getAllPodcasts() {
return new ArrayList<Podcast>(podcasts.values());
}
}
PodcastRepository
package com.integration.messenger.repository;
import java.util.Map;
import com.integration.messenger.model.Podcast;
public interface PodcastRepository {
Map<Long, Podcast> getPodcasts();
}
PodcastRepositoryImpl
package com.integration.messenger.repository;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.integration.messenger.model.Podcast;
#Repository
public class PodcastRepositoryImpl implements PodcastRepository {
private static Map<Long, Podcast> podcasts = new HashMap<Long, Podcast>();
public Map<Long, Podcast> getPodcasts() {
return podcasts;
}
}
Podcast
package com.integration.messenger.model;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement
public class Podcast implements Serializable{
private static final long serialVersionUID = -1471231465385956738L;
#XmlElement(name = "id")
private long id;
#XmlElement(name = "feed")
private String feed;
#XmlElement(name = "title")
private String title;
#XmlElement(name = "linkOnPodcastpedia")
private String linkOnPodcastpedia;
#XmlElement(name = "description")
private String description;
public Podcast(int id, String feed, String title, String linkOnPodcastpedia, String description) {
this.id = id;
this.feed = feed;
this.title = title;
this.linkOnPodcastpedia = linkOnPodcastpedia;
this.description = description;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFeed() {
return feed;
}
public void setFeed(String feed) {
this.feed = feed;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLinkOnPodcastpedia() {
return linkOnPodcastpedia;
}
public void setLinkOnPodcastpedia(String linkOnPodcastpedia) {
this.linkOnPodcastpedia = linkOnPodcastpedia;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
MyApplication
package com.integration.messenger;
import org.glassfish.jersey.jackson1.Jackson1Feature;
import org.glassfish.jersey.server.ResourceConfig;
import com.integration.messenger.resources.PodcastResource;
public class MyApplication extends ResourceConfig{
/**
* Register JAX-RS application components.
*/
public MyApplication() {
// register application resources
register(PodcastResource.class);
// register features
// register Jackson JSON providers - for the application to understand JSON data
register(Jackson1Feature.class);
}
}
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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<context:component-scan base-package="com.integration.messenger" />
</beans>
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>jersey-Spring-Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.integration.messenger.MyApplication</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-Spring-Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<display-name>Restful Web Application</display-name>
</web-app>
ERROR:
WARNING: Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'podcastResource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.integration.messenger.service.PodcastService com.integration.messenger.resources.PodcastResource.podcastService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'podcastService' defined in file [C:\My_Workspaces\My_Work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\messenger\WEB-INF\classes\com\integration\messenger\service\PodcastServiceImp.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.integration.messenger.service.PodcastServiceImp]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
I guess you need to make some configuration related changes to integrate Spring with Jersey. Some I can think of,
Register Spring ContextLoaderListener. (This loads the spring xml file).
Make use of spring related jersey servlet com.sun.jersey.spi.spring.container.servlet.SpringServlet or org.glassfish.jersey.servlet.ServletContainer(in the latest versions I believe)
Specify in the spring xml file.
-Madhu.
i am new in ejb3 application
my project is:
ServletController.java
package controller;
import java.io.IOException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.HelloUser;
public class ServletController extends HttpServlet {
#Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
try {
InitialContext Context = new InitialContext();
Context context = new InitialContext();
HelloUser helloUser = (HelloUser) context.lookup("ejb3/" + HelloUser.class.getSimpleName() + "/local");
System.out.println(".................................");
helloUser.sayHello("reza");
arg1.sendRedirect("reza");
} catch (Exception e) {
e.printStackTrace();
}
}
}
HelloUser.java:
package com;
import javax.ejb.Local;
#Local
public interface HelloUser {
public void sayHello(String name);
}
HelloUserBean.java
package com;
import javax.ejb.Stateless;
#Stateless
public class HelloUserBean implements HelloUser {
public HelloUserBean() {
}
public void sayHello(String name) {
System.out.println("Hello " + name + " welcome to EJB 3!");
}
}
web.xml
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Baharan-Framework</display-name>
<welcome-file-list>
<welcome-file>Index.jsp</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>controller.ServletController</servlet-class>
</servlet>
</web-app>
the following error is raised when ServletController is called by webbrowser(URL is:http://localhost:7001/weblogic/rest/jkfg):
javax.naming.NameNotFoundException: While trying to lookup 'ejb3.HelloUser/local' didn't find subcontext 'ejb3'. Resolved ''; remaining name 'ejb3/HelloUser/local'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:247)
First of all, Weblogic print all jndi names assigned to every Enterprise bean, and you can get it directly. The second, remove context.lookup("ejb3/" + HelloUser.class.getSimpleName() + "/local"); then in simple cases this function can helps you:
public static <T>T lookupBean(Class<T> beanClass) {
final String jndiName = "java:module/" + beanClass.getSimpleName();
logger.info("lookup : {}", jndiName);
try {
T bean = InitialContext.doLookup(jndiName);
logger.info("detected : {}", bean);
return bean;
}
catch(NamingException e) {
logger.error(e.getMessage(), e);
return null;
}
Can you provide me deployments log?? and rather then trying using initialcontext lookup with #EJB annotation.
I am using Spring 4.0.6 with Liferay 6.2. Spring isn't able to inject autowired components in to the hook, object comes as null. I have also tried with spring version 3.1 that comes with liferay. Same code works in portlets but not in hooks.
private ApplicationEventPublisher publisher in ActivityEventPublisher.java is null.
web.xml
<?xml version="1.0"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web- app_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.liferay.portal.kernel.servlet.SecurePluginContextListener</listener- class>
</listener>
<listener>
<listener-class>com.liferay.portal.kernel.servlet.PortletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>ViewRendererServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ViewRendererServlet</servlet-name>
<url-pattern>/WEB-INF/servlet/view</url-pattern>
</servlet-mapping>
</web-app>
ActivityEventPublisher.java
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;
import connect.activity.solr.document.ActivityData;
#Component
public class ActivityEventPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
#Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public ApplicationEventPublisher getPublisher() {
return publisher;
}
public void setPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void publish(ActivityData data) {
ActivityEvent event = new ActivityEvent(this);
event.setActivityData(data);
this.publisher.publishEvent(event);
}
}
Any help will be much appreciated.
Thanks
Unfortunately, autowired mechanisms are not allowed in hooks, wrappers or startup actions at Liferay.
You can implement an ApplicationContextProvider, it's so easy and useful:
#Component("applicationContextProvider")
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx = null;
public static ApplicationContext getApplicationContext() {
return ctx;
}
#Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
ctx = ac;
}
}
An example of use in a Hook will be the following:
public class PostLoginActionHook extends Action {
// That code "replaces" #Autowired annotation
private final UserProxyService userProxyService = (UserProxyService) ApplicationContextProvider.
getApplicationContext().getBean(UserProxyService.class);
#Override
public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException {
UserVO myCustomUser = userProxyService.getCustomUserByLiferayUser(user.getUserId());
{...}
}
Hope it helps!
What am I missing?
I am trying to create a basic SpringMVC application using Hibernate. I have another SpringMVC application that I model it after and it works.
I have apparently missed something and I am at a loss. Any help here would be much appreciated. Just another pair of eyes might solve the problem. Maybe I am blind.
Basically the error is telling me that I cannot create customerService bean in my controller because the customerDao bean cannot be located and therefore cannot be injected into the service.
When I use Intellij I am able to follow the bean references and everything appears
to be wired up correctly but when I run in tomcat6 or tomcat7 get the following errors:
Sep 26, 2013 10:13:02 AM org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mydomain.dao.CustomerDao com.mydomain.service.CustomerService.customerDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mydomain.dao.CustomerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
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:724)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mydomain.dao.CustomerDao com.mydomain.service.CustomerService.customerDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mydomain.dao.CustomerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
... 21 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mydomain.dao.CustomerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
... 23 more
Sep 26, 2013 10:13:02 AM org.apache.catalina.core.StandardContext startInternal
Code as follows:
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.mydomain.config.WebConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.mydomain.config.WebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
WebConfig.java
package com.mydomain.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
#EnableWebMvc
#Configuration
#Import({DaoConfig.class, ServiceConfig.class, ControllerConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {
#Override
public Validator getValidator(){
return new LocalValidatorFactoryBean();
}
#Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
return resolver;
}
#Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
DaoConfig.java
package com.mydomain.config;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
#Configuration
#EnableTransactionManagement
#ComponentScan({"com.mydomain.dao", "com.mydomain.service"})
public class DaoConfig {
#Bean
public LocalSessionFactoryBean getSessionFactory(){
final LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(getDataSource());
sessionFactoryBean.setPackagesToScan(new String[]{"com.mydomain.domain"});
sessionFactoryBean.setHibernateProperties(hibernateProperties());
return sessionFactoryBean;
}
#Bean
public DataSource getDataSource(){
final DriverManagerDataSource dmds = new DriverManagerDataSource();
dmds.setDriverClassName("com.mysql.jdbc.Driver");
dmds.setUsername("root");
dmds.setPassword("");
dmds.setUrl("jdbc:mysql://localhost/commandsearch");
return dmds;
}
#Bean
public HibernateTransactionManager transactionManager() {
final HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(getSessionFactory().getObject());
return txManager;
}
#Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
final Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.hbm2ddl.auto", "update");
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
setProperty("hibernate.show_sql", "true");
}
};
}
}
IAbstractDao.java
package com.mydomain.dao;
import java.io.Serializable;
import java.util.List;
public interface IAbstractDao <T extends Serializable> {
T findOne(final long id);
List<T> findAll();
void save(final T t);
void delete(final T t);
void deleteById(final long id);
}
AbstractHibernateDao.java
package com.mydomain.dao;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class AbstractHibernateDao<T extends Serializable> implements IAbstractDao<T> {
protected Class<T> entityClass;
protected final Log logger = LogFactory.getLog(getClass());
protected AbstractHibernateDao(Class<T> entityClass){
this.entityClass = entityClass;
}
#Autowired
private SessionFactory sessionFactory;
protected final Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
#Override
public T findOne(final long id) {
return ((T) getCurrentSession().get(entityClass, id));
}
#Override
public List<T> findAll() {
return (List<T>)getCurrentSession().createQuery("from " + entityClass.getName()).list();
}
#Override
public void save(final T t) {
getCurrentSession().saveOrUpdate(t);
}
#Override
public void delete(final T t) {
getCurrentSession().delete(t);
}
#Override
public void deleteById(final long id) {
final T entity = findOne(id);
delete(entity);
}
}
CustomerDao.java
package com.mydomain.dao;
import org.springframework.stereotype.Repository;
import com.mydomain.domain.Customer;
#Repository
public class CustomerDao extends AbstractHibernateDao<Customer> {
public CustomerDao(){
this(Customer.class);
}
public CustomerDao(Class<Customer> entityClass){
super(entityClass);
}
}
ServiceConfig.java
package com.mydomain.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
#Configuration
#ComponentScan({"com.mydomain.service"})
public class ServiceConfig {
}
AbstractService.java
package com.mydomain.service;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.transaction.annotation.Transactional;
import com.mydomain.dao.IAbstractDao;
#Transactional
public abstract class AbstractService<T extends Serializable> {
protected final Log logger = LogFactory.getLog(getClass());
public T findOne(final long id) {
return getDao().findOne(id);
}
public List<T> findAll() {
return getDao().findAll();
}
public void save(final T entity) {
getDao().save(entity);
}
public void delete(final T entity) {
getDao().delete(entity);
}
public void deleteById(final long entityId) {
getDao().deleteById(entityId);
}
protected abstract IAbstractDao<T> getDao();
}
CustomerService.java
package com.mydomain.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.mydomain.dao.CustomerDao;
import com.mydomain.dao.IAbstractDao;
import com.mydomain.domain.Customer;
#Service
#Transactional
public class CustomerService extends AbstractService<Customer>{
#Autowired
private CustomerDao customerDao;
#Override
protected IAbstractDao<Customer> getDao() {
return customerDao;
}
}
Your immediate problem is this
package com.mydomain.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
#Configuration
#ComponentScan({"com.mydomain.service"})
public class ServiceConfig {
}
You're scanning your #Service class but you have nothing in that context that gives you a CustomerDao bean available for injection so it fails with the exception you have.
There are a bunch of other things wrong with your configuration. Your DaoConfig scans both dao and service packages. This on its own is not bad, but you have all the other XConfig classes that are redundant.
Also, your web.xml configuration is going to create 2 WebConfig contexts, one for the DispatcherServlet and one for the ContextLoaderListener.
Your ContextLoaderListener should load the root context and the DispatcherServlet should load the servlet context.
For example, the DispatcherServlet should load the WebConfig as such
#EnableWebMvc
#Configuration
#Import(ControllerConfig.class)
public class WebConfig extends WebMvcConfigurerAdapter {
Note it only #Imports ControllerConfig.
Your ContextLoaderListener should load the application config as such
#Configuration
#EnableTransactionManagement
#ComponentScan({"com.mydomain.dao", "com.mydomain.service"}, ...)
public class ApplicationConfig {
// all the #Bean methods from each of your other XxxConfig classes
}
If you want to modularize it further, keep in mind that #Import only works on the #Configuration class or context that is using it, not on the context being imported.
I've some trouble with injecting one managedbean in another by defining a managedproperty. I'm googling and stackoverflowing now for 3 days, but with no result...
I'm developing with eclipse 4.2 and deploying to an integrated Tomcat 7
So, can anybody tell me, why my property is null?
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>3.0.5.RELEASE</spring.version>
<java.version>1.6</java.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
web.xml
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
I have set the beans in applicationContext for scanning #Autowired annotation. (Yes, i tried it without beans in applicationContext, but ManagedProperty will not be set, too.)
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="myPackage" />
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean class="myPackage.dao.UserDao" id="userDao" />
<bean class="myPackage.dao.WorldDao" id="worldDao" />
<bean class="myPackage.dao.BuildingTypeDao" id="buildingTypeDao" />
<bean class="myPackage.dao.BuffTypeDao" id="buffTypeDao" />
<bean class="myPackage.dao.ClanDao" id="clanDao" />
<bean class="myPackage.bean.MainBean" id="mainBean" />
<bean class="myPackage.bean.UserBean" id="userBean" />
<bean class="myPackage.bean.AdminBean" id="adminBean" />
MainBean
package myPackage.bean;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import myPackage.model.MainModel;
#ManagedBean
#SessionScoped
public class MainBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(MainBean.class);
private MainModel model;
/**
* #return the model
*/
public MainModel getModel() {
if (model == null) {
model = new MainModel();
}
return model;
}
/**
* #param model the model to set
*/
public void setModel(MainModel model) {
this.model = model;
}
}
UserBean
package myPackage.bean;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import myPackage.dao.UserDao;
import myPackage.entity.User;
#ManagedBean
#RequestScoped
public class UserBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(UserBean.class);
#ManagedProperty(value="#{mainBean}")
private MainBean mainBean;
#Autowired
private UserDao userDao;
/**
* #return the mainBean
*/
public MainBean getMainBean() {
return mainBean;
}
/**
* #param mainBean the mainBean to set
*/
public void setMainBean(MainBean mainBean) {
this.mainBean = mainBean;
}
public String doLogin() {
User user = userDao.getUserByUsernameAndPassword(getMainBean().getModel().getUser().getUsername(), getMainBean().getModel().getUser().getPassword());
if (user != null) {
getMainBean().getModel().setUser(user);
logger.info("User '"+getMainBean().getModel().getUser().getUsername()+"' logged in");
getMainBean().getModel().setSelectedTab(0);
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Login failed", "Username and/or password wrong!"));
logger.warn("User '"+getMainBean().getModel().getUser().getUsername()+"' login failed");
}
return null;
}
UserDao
package myPackage.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import myPackage.entity.User;
#Repository
public class UserDao {
#PersistenceContext
private EntityManager entityManager;
#Transactional
public void save(User user) {
if (user.getId() == null) {
entityManager.persist(user);
} else {
entityManager.merge(user);
}
}
#SuppressWarnings("unchecked")
public List<User> list() {
return entityManager.createQuery("select u from User u")
.getResultList();
}
public User getUserByUsername(String username) {
try {
Query q = entityManager.createQuery("select u from User u where u.username = :username");
q.setParameter("username", username);
User u = (User) q.getSingleResult();
return u;
} catch (Exception e) {
return null;
}
}
public User getUserByUsernameAndPassword(String username, String password) {
try {
Query q = entityManager.createQuery("select u from User u where u.username = :username and u.password = :password");
q.setParameter("username", username);
q.setParameter("password", password);
User u = (User) q.getSingleResult();
return u;
} catch (Exception e) {
return null;
}
}
#Transactional
public User getUserById(Long id) {
return entityManager.find(User.class, id);
}
#Transactional
public void delete(User user) {
entityManager.remove(user);
}
public void deleteById(Long id) {
delete(getUserById(id));
}
}
And now the Exception...
Caused by: java.lang.NullPointerException
at myPackage.bean.UserBean.doLogin(UserBean.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
Line 47:
User user = userDao.getUserByUsernameAndPassword(getMainBean().getModel().getUser().getUsername(), getMainBean().getModel().getUser().getPassword());
Debugging shows that getMainBean() returns null.
I'm open for suggests to improve my concept!
Your JSF backing beans (MainBean and UserBean) should be managed either by JSF or by Spring, but not by both of them.
If your beans are managed by JSF:
You annotate them with #ManagedBean and #...Scoped
You don't need to declare them in applicationContext.xml
You use #ManagedProperty instead of #Autowired, even if you need to inject beans managed by Spring (don't forget setters, #ManagedProperty requires it):
#ManagedProperty("#{userDao}")
private UserDao userDao;
If your beans are managed by Spring:
You declare them in applicationContext.xml with appropriate scopes (view scope is not supported)
You don't need #ManagedBean and #...Scoped
You use #Autowired instead of #ManagedProperty and you cannot inject beans managed by JSF this way
In both cases you need to configure Spring-JSF bridge in faces-context.xml:
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>