[英]How to use an EJB in a Web Services Java EE
I'm trying to use the methods that I have in a DAO interface . 我正在尝试使用DAO接口中的方法 。 When i'm calling there in a Servlet , I have no problems, for example, if I test 当我在Servlet中调用时,我没有问题,例如,如果我测试
@WebServlet("/Index")
public class Index extends HttpServlet {
private static final long serialVersionUID = 1L;
//etc
@EJB
InterfacesDao dao;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//dao.getUsers(); //works well
//System.out.println(dao); //will print the dao object correctly
Boolean logged = dao.login("myLogin","mystrongpassword"); //works
request.setAttribute("logged",logged);
request.getRequestDispatcher("/jsp/login.jsp").forward(request, response);
}
//etc
}
But I want to use ajax and so pass by a WebServices . 但是我想使用ajax ,所以通过WebServices传递。 I can test 我可以测试一下
@WebService
@Path("/users")
public class UserService {
@POST
@Path("/login")
@Produces("application/json")
public String login(@FormParam("login") String login, @FormParam("pwd") String mdp) {
return "Hello World" + login;
}
}
If I go to http://[...]/rest/users/login
with an json object which contains a login and a pwd, I get Hello World theloginientered
But I need to use EJB 如果我使用包含登录名和pwd的json对象转到http://[...]/rest/users/login
,我会得到Hello World theloginientered
但我需要使用EJB
@WebService
@Path("/users")
public class UserService {
@EJB
InterfacesDao dao;
@POST
@Path("/login")
@Produces("application/json")
public String login(@FormParam("login") String login, @FormParam("pwd") String mdp) {
//System.out.println(dao); //dao null ?
//dao.getUsers(); //erros because dao null
Boolean logged = dao.login(login,pwd); //doesn't work
//I not arrive till here because NullPointerException error
return "Hello World" + login;
}
}
I tried to instance by passing the reference of the dao in my servlet to my Web Service , but doesn't work I tried to have just 1 EJB in my WebService , init in constructor, and get it from my Servlet by a getter , but again null 我尝试通过将我的servlet中的dao的引用传递给我的Web服务来实例化,但是不起作用我试图在我的WebService中只有1个EJB ,在构造函数中只有init,并且通过getter从我的Servlet中获取它,但是再次为空
I think I forgot a config for the EJB dependency injection but in my Servlet I do no more less. 我想我忘记了EJB依赖注入的配置,但在我的Servlet中我做的不多了。
Import for the web services 导入Web服务
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.servlet.annotation.WebServlet;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import com.supinfo.interfaces.InterfacesDao;
import com.supinfo.servlet.Index;
Import for the Servlet 导入Servlet
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.supinfo.interfaces.InterfacesDao;
Interfaces DAO Web side and EJB side 接口DAO Web端和EJB端
package com.supinfo.interfaces;
import java.util.List;
import javax.ejb.Remote;
import com.supinfo.entity.User;
@Remote
public interface InterfacesDao {
public boolean login(String login, String mdp);
public boolean signin(String login, String mdp);
public List<User> getUsers();
}
The Implementation 实施
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.supinfo.database.PersistenceManager;
import com.supinfo.entity.User;
import com.supinfo.interfaces.InterfacesDao;
@Stateless
public class InterfaceDaoImpl implements InterfacesDao{
@Override
public List<User> getUsers() {
EntityManager em = PersistenceManager.getEntityManager();
Query query = (Query) em.createQuery("Select u FROM User u ");
List<User> persons = query.getResultList();
return persons;
}
@Override
public boolean login(String login, String mdp) {
EntityManager em = PersistenceManager.getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> person = query.from(User.class);
query.where(cb.equal(person.get("login"), login)).where(cb.equal(person.get("mdp"), mdp));
List<User> persons = em.createQuery(query).getResultList();
//Boolean isEmpty = persons.isEmpty();
//return !(isEmpty == null ? false : isEmpty);
return !persons.isEmpty();
}
Thanks for reading 谢谢阅读
The import statements are not included in the sample code, but I assume that you are trying to use JAX-RS and not a WebService. import语句不包含在示例代码中,但我假设您尝试使用JAX-RS而不是WebService。 In that case, you should delete the @WebService
annotation. 在这种情况下,您应该删除@WebService
批注。
Depending on the server (and version) you are using the injection of the dao
will not instantly work using @EJB
as annotation. 根据您使用的服务器(和版本),注入dao
将不会立即使用@EJB
作为注释。 You can however transform the JAX-RS endpoint to a @Stateless
bean, that should take care of your injection problem. 但是,您可以将JAX-RS端点转换为@Stateless
bean,这应该可以解决您的注入问题。
In short use: 简而言之:
@Stateless @Path("/users") public class UserService { @EJB // @Inject is also an option InterfacesDao dao;
You may also want to use the newer @Inject
annotation instead of @EJB
. 您可能还想使用较新的@Inject
注释而不是@EJB
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.