如何在Web服务JavaEE中使用EJB
我正在尝试使用DAO接口中的方法。当我在一个Servlet中调用那里时,我没有问题,例如,如果我测试如何在Web服务JavaEE中使用EJB,java,web-services,servlets,jakarta-ee,ejb-3.0,Java,Web Services,Servlets,Jakarta Ee,Ejb 3.0,我正在尝试使用DAO接口中的方法。当我在一个Servlet中调用那里时,我没有问题,例如,如果我测试 @WebServlet("/Index") public class Index extends HttpServlet { private static final long serialVersionUID = 1L; //etc @EJB InterfacesDao dao; protected void doGet(HttpServletRequest
@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
}
但是我想使用ajax,因此经过一个WebServices。
我可以测试
@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;
}
}
如果我使用一个包含登录名和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;
}
}
我试图通过将我的servlet中的dao引用传递给我的Web服务来进行实例验证,但没有成功
我试图在我的WebService中只有1个EJB,在构造函数中使用init,并通过getter从我的Servlet中获取它,但还是空的
我想我忘记了EJB依赖项注入的配置,但在我的Servlet中,我没有做更多
为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;
为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;
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();
}
package com.supinfo.interfaces;
导入java.util.List;
导入javax.ejb.Remote;
导入com.supinfo.entity.User;
@遥远的
公共接口接口DAO{
公共布尔登录(字符串登录,字符串mdp);
公共布尔签名(字符串登录,字符串mdp);
公共列表getUsers();
}
实施
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();
}
import java.util.List;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.Query;
导入javax.persistence.criteria.CriteriaBuilder;
导入javax.persistence.criteria.CriteriaQuery;
导入javax.persistence.criteria.Root;
导入com.supinfo.database.PersistenceManager;
导入com.supinfo.entity.User;
导入com.supinfo.interfaces.InterfacesDao;
@无国籍
公共类InterfaceDaoImpl实现InterfacesDao{
@凌驾
公共列表getUsers(){
EntityManager em=PersistenceManager.getEntityManager();
Query Query=(Query)em.createQuery(“从用户u中选择u”);
List persons=query.getResultList();
返回人员;
}
@凌驾
公共布尔登录(字符串登录,字符串mdp){
EntityManager em=PersistenceManager.getEntityManager();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(User.class);
Root person=query.from(User.class);
where(cb.equal(person.get(“login”),login)).where(cb.equal(person.get(“mdp”),mdp));
List persons=em.createQuery(query.getResultList();
//布尔值isEmpty=persons.isEmpty();
//return!(isEmpty==null?false:isEmpty);
返回!persons.isEmpty();
}
感谢阅读示例代码中没有包含导入语句,但我假设您正在尝试使用JAX-RS而不是WebService。在这种情况下,您应该删除
@WebService
注释
根据服务器(和版本)的不同,使用dao
注入将不会立即使用@EJB
作为注释。但是,您可以将JAX-RS端点转换为@无状态
bean,这将解决注入问题
简而言之:
@Stateless
@Path("/users")
public class UserService {
@EJB // @Inject is also an option
InterfacesDao dao;
@无国籍
@路径(“/users”)
公共类用户服务{
@EJB/@Inject也是一个选项
接口刀刀刀;
您可能还想使用较新的
@Inject
注释,而不是@EJB
示例代码中不包含导入语句,但我假设您尝试使用的是JAX-RS,而不是Web服务。在这种情况下,您应该删除@WebService
注释
根据服务器(和版本)的不同,使用dao
注入将不会立即使用@EJB
作为注释。但是,您可以将JAX-RS端点转换为@无状态
bean,这将解决注入问题
简而言之:
@Stateless
@Path("/users")
public class UserService {
@EJB // @Inject is also an option
InterfacesDao dao;
@无国籍
@路径(“/users”)
公共类用户服务{
@EJB/@Inject也是一个选项
接口刀刀刀;
您可能还想使用较新的
@Inject
注释,而不是@EJB
谢谢您的回复。但是它不起作用,它是同一个nullPointeur:StandardWrapperValve[Jersey Web Application]:为servlet Jersey Web应用程序java.lang.NullPointerException分配异常是否可以使用导入语句更新代码并包含InterfacesDao类的定义?InterfacesDao定义为@Remote
。如果不需要远程访问,请使用@Local
接口或Int的无接口视图erfaceDaoImpl。感谢您的回复。但它不起作用。它是同一个nullPointeur:StandardWrapperValve[泽西网络应用程序]:为servlet Jersey Web应用程序java.lang.NullPointerException分配异常是否可以使用导入语句更新代码并包含InterfacesDao类的定义?InterfacesDao定义为@Remote
。如果不需要远程访问,请使用@Local
接口或Int的无接口视图erfaceDaoImpl。