【问题标题】:How to use an EJB in a Web Services Java EE如何在 Web 服务 Java EE 中使用 EJB
【发布时间】:2017-06-02 15:42:09
【问题描述】:

我正在尝试使用 DAO 接口 中的方法。当我在 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

}

但我想使用 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;
    }
}

如果我使用包含登录名和密码的 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,在构造函数中初始化,并通过 getter 从我的 Servlet 中获取它em>,但又是 null

我想我忘记了 EJB 依赖注入的配置,但在我的 Servlet 中我做的不多。

为网络服务导入

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;

接口 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();

}

实现

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();

    }

感谢阅读

【问题讨论】:

    标签: java web-services servlets jakarta-ee ejb-3.0


    【解决方案1】:

    示例代码中不包含导入语句,但我假设您尝试使用 JAX-RS 而不是 WebService。在这种情况下,您应该删除 @WebService 注释。

    根据您使用dao 注入的服务器(和版本),使用@EJB 作为注解不会立即起作用。但是,您可以将 JAX-RS 端点转换为 @Stateless bean,这应该可以解决您的注入问题。

    简而言之:

    @无状态 @Path("/用户") 公共类用户服务{ @EJB // @Inject 也是一个选项 InterfacesDao dao;

    您可能还想使用较新的@Inject 注释而不是@EJB

    【讨论】:

    • 感谢您的回复。但它不起作用,它是相同的 nullPointeur:StandardWrapperValve[Jersey Web Application]: Allocate exception for servlet Jersey Web Application java.lang.NullPointerException
    • 能否请您使用 import 语句更新代码并包含 InterfacesDao 类的定义?
    • InterfacesDao 定义为@Remote。如果不需要远程访问,请使用 @Local 接口或 InterfaceDaoImpl 的无接口视图。
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-03-20
    • 2019-08-29
    相关资源
    最近更新 更多