EJB Invocation failed

0

Witam,

Aktualnie pisze aplikację w oparciu o JEE, mam rozdzieloną logikę biznesową, mechanizm utrwalania w DB, oraz osobno web interfejs. Wszystko podpięte pod enterprise app projekt. Korzystam z JBoss 7
Korzystam z JSF 2.0, EJB 3.0, JPA 2.

Zrobiłem osobny projekt obsługujący mechanizm JPA, projekt EJB korzysta z obiektów DAO, a web(JSF) projekt korzysta z EJB po remote.
Tutaj właśnie pojawia się problem... Robię sobie managed beany po stronie web projektu które mają dostęp do beanów. Problem polega na tym, że nie mogę wywoływać zdalnie beanów. Dostaje NullPointerExc i komunikat EJB Invocation failed.

Dla każdego beana utworzyłem interfejs remote do którego odwołuję się po stronie web projektu.

Przykład:

@Remote(UserServiceRemote.class)
public interface UserServiceRemote {
	public String sayHello();
	public boolean saveUser(User user);
	public boolean deleteUser(User user);
	public User updateUser(User user);
	public User findUser(int userId);
	public List<User> findAllUsers();	
}

Do tego implementacja beana:
package com.travel.agency.bean;

import java.util.List;

import javax.ejb.Stateless;

import com.travel.agency.dao.UserDAO;
import com.travel.agency.entities.User;
import com.travel.agency.interfaces.UserServiceRemote;

@Stateless
public class UserService implements UserServiceRemote {

	public UserService() {
	}

	private UserDAO userDAO = new UserDAO();

	@Override
	public String sayHello() {
		return "HELLO WORLD";
	}

	@Override
	public boolean saveUser(User user) {
		// TODO login validator
		userDAO.save(user);
		return true;
	}

	@Override
	public boolean deleteUser(User user) {
		User u = findUser(user.getId());
		if (u != null) {
			userDAO.delete(user);
			return true;
		}
		return false;
	}

	@Override
	public User findUser(int userId) {
		return userDAO.find(userId);
	}

	@Override
	public List<User> findAllUsers() {
		return userDAO.findAll();
	}

	@Override
	public User updateUser(User user) {
		return userDAO.update(user);
	}

}

UserDao(po stronie projektu JPA):

package com.travel.agency.dao;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.Query;

import com.travel.agency.entities.User;


public class UserDAO extends GenericDAO<User> {

	public UserDAO() {
		super(User.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<User> findAll() {
		Query query = em.createQuery("SELECT u FROM users u;");
		return (List<User>) query.getResultList();
	}

}

GenericDAO

package com.travel.agency.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public abstract class GenericDAO<T> {

	
	@PersistenceContext()
	EntityManager em;
	
	private Class<T> entityClass;
	
	public GenericDAO(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
	
	public void save(T entity) {
		em.persist(entity);
	}
	
	public void delete(T entity) {
		T entityToBeRemoved = em.merge(entity);
		em.remove(entityToBeRemoved);
	}
	
	public T update(T entity) {
		return em.merge(entity);
	}
	
	public T find(int entityID) {
		return em.find(entityClass, entityID);
	}
	
	public abstract List<T> findAll();
}

I w końcu managed bean po stronie JSF:

package com.travel.agency.managed.bean;

import java.util.ArrayList;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.bean.ManagedBean;
import com.travel.agency.entities.User;
import com.travel.agency.interfaces.UserServiceRemote;

public class ManagedUserService {

	@EJB()
	UserServiceRemote userService;

	private String login;
	private String pass;
	private String role;
	private String name;
	private String surname;
	private String email;
	private String city;
	private String country;
	private ArrayList<User> users;
	private boolean terms;

	private void addMessage(FacesMessage message){
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
    
	public String loginUser() {
		return "success";
	}
	
    public String addUser(){
    	User user = new User();
    	user.setAdress(adress);
    	user.setCity(city);
    	user.setCountry(country);
    	user.setEmail(email);
    	user.setLogin(login);
    	user.setName(name);
    	user.setPass(pass);
    	user.setSurname(surname);
    	boolean result = userService.saveUser(user);
    	//boolean result = Boolean.valueOf(true);
    	String status = "failure";
    	
    	if(result) {
    		addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Rejestracja nowej wycieczki przebiegla pomyslnie!!!", null));
    		status = "success";
    	} else {
    		addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Rejestracja nowej wycieczki nie udala sie!!!", null));
    		status = "failure";
    	}
    	
        return status;
    }
	
	public ArrayList<User> getUsers() {
		users = new ArrayList<User>();
		User user = new User();
		user.setName("xxx");
		user.setAdress("xxx");
		user.setSurname("xxx");
		user.setCity("Kielce");
		user.setCountry("Polska");
		user.setEmail("xxx");
		user.setLogin("xxx");
		user.setPass("xx");
		user.setRole("admin");
		users.add(user);
		
		//users = (ArrayList<User>) userService.findAllUsers();
		
		return users;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public String getAdress() {
		return adress;
	}

	public void setAdress(String adress) {
		this.adress = adress;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public boolean isTerms() {
		return terms;
	}

	public void setTerms(boolean terms) {
		this.terms = terms;
	}

	private String adress;

}

Po wywołaniu dostaje następujący błąd:

 
19:03:45,319 ERROR [org.jboss.ejb3.invocation] (http-localhost-127.0.0.1-8080-1) JBAS014134: EJB Invocation failed on component UserService for method public abstract boolean com.travel.agency.interfaces.UserServiceRemote.saveUser(com.travel.agency.entities.User): javax.ejb.EJBException: java.lang.NullPointerException
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ejb3.remote.EJBRemoteTransactionPropogatingInterceptor.processInvocation(EJBRemoteTransactionPropogatingInterceptor.java:80) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) [jboss-as-ee-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) [jboss-as-ee-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
	at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) [jboss-as-ee-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.ejb3.remote.LocalEjbReceiver.processInvocation(LocalEjbReceiver.java:179) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:173) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.TransactionInterceptor.handleInvocation(TransactionInterceptor.java:43) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:175) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:92) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:175) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104) [jboss-ejb-client-1.0.2.Final.jar:1.0.2.Final]
	at com.sun.proxy.$Proxy21.saveUser(Unknown Source)
	at com.travel.agency.managed.bean.ManagedUserService.addUser(ManagedUserService.java:46)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_21]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_21]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_21]
	at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_21]
	at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.Final.jar:7.1.0.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:154)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
	at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_21]

itd...
0

Skoro chcesz to robić przez remote to rozumiem że ustawiłeś jakiś binding w jndi? Bo inaczej jak twoja aplikacja ma wiedzieć "skąd" ma wziąć tego beana (który, skoro jest remote, może być na drugim końcu świata)...

0

Beany są zbindowane.

	java:global/travel.agency.com/travel.agency.com.ejb/UserService!com.travel.agency.interfaces.UserServiceRemote
	java:app/travel.agency.com.ejb/UserService!com.travel.agency.interfaces.UserServiceRemote
	java:module/UserService!com.travel.agency.interfaces.UserServiceRemote
	java:global/travel.agency.com/travel.agency.com.ejb/UserService
	java:app/travel.agency.com.ejb/UserService
	java:module/UserService

Odwołując się przed dodanie @ejb(mappedName="nazwa jndi ") nie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1