簡體   English   中英

如何在Web Services Java EE中使用EJB

[英]How to use an EJB in a Web Services Java EE

我正在嘗試使用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;
    }
}

如果我使用包含登錄名和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;

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

    }

謝謝閱讀

import語句不包含在示例代碼中,但我假設您嘗試使用JAX-RS而不是WebService。 在這種情況下,您應該刪除@WebService批注。

根據您使用的服務器(和版本),注入dao將不會立即使用@EJB作為注釋。 但是,您可以將JAX-RS端點轉換為@Stateless bean,這應該可以解決您的注入問題。

簡而言之:

@Stateless
@Path("/users")
public class UserService {

    @EJB // @Inject is also an option
    InterfacesDao dao;

您可能還想使用較新的@Inject注釋而不是@EJB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM