Servlets 使用Glassfish4的servlet(JavaEE)中的IllegalArgumentException

Servlets 使用Glassfish4的servlet(JavaEE)中的IllegalArgumentException,servlets,jakarta-ee,glassfish,ejb,illegalargumentexception,Servlets,Jakarta Ee,Glassfish,Ejb,Illegalargumentexception,我有一个servlet,用于检索存储在JavaEE数据库中的用户 调用servlet时,我从Glassfish4中得到以下错误 type: Exception report message: Internal Server Error description: The server encountered an internal error that prevented it from fulfilling this request. exception javax.servlet.Se

我有一个servlet,用于检索存储在JavaEE数据库中的用户

调用servlet时,我从Glassfish4中得到以下错误

type: Exception report

message: Internal Server Error

description: The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Error instantiating servlet class com.storassa.javaee.scuolatennis.nicola.GetPlayersApi

root cause

com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class: class com.storassa.javaee.scuolatennis.nicola.GetPlayersApi

root cause

com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Local ejb-ref name=com.storassa.javaee.scuolatennis.nicola.GetPlayersApi/playerEjb,Local 3.x interface =com.storassa.javaee.scuolatennis.nicola.PlayerEJB resolved to intra-app EJB PlayerEJB in module scuolatennisnicola-0.0.1-SNAPSHOT,ejb-link=PlayerEJB,lookup=,mappedName=,jndi-name=,refType=Session into class com.storassa.javaee.scuolatennis.nicola.GetPlayersApi: Can not set com.storassa.javaee.scuolatennis.nicola.PlayerEJB field com.storassa.javaee.scuolatennis.nicola.GetPlayersApi.playerEjb to com.storassa.javaee.scuolatennis.nicola.GetPlayersApi

root cause

java.lang.IllegalArgumentException: Can not set com.storassa.javaee.scuolatennis.nicola.PlayerEJB field com.storassa.javaee.scuolatennis.nicola.GetPlayersApi.playerEjb to com.storassa.javaee.scuolatennis.nicola.GetPlayersApi
消息似乎表明servlet被分配给EJB,但这怎么可能发生呢?还是我误解了这个信息

奇怪的是,在显示此错误消息之后,如果我再次尝试重新加载页面,将返回一条404消息,就好像servlet已从应用程序“取消部署”,再次看到相同错误消息的唯一方法是重新部署应用程序。 这是servlet:

<imports...>

/**
 * Servlet implementation class GetPlayersApi
 * 
 * The API is the following: if nothing is present retrieves all the players if
 * ordered=true, retrieves all the players ordered if email=<email> retrieve the
 * player with the given email
 */
@WebServlet("/api/getPlayers")
public class GetPlayersApi extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // The list of the News to store the query in the DB
    List<Player> players;

    // Inject the News bean to get the data from DB
    @EJB
    PlayerEJB playerEjb;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetPlayersApi() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // get the map of the request parameters
        HashMap<String, String[]> map = (HashMap<String, String[]>) request.getParameterMap();

        // if no parameters are given
        if (map.size() == 0)
            // retrieve all the tags currently in the DB
            players = playerEjb.findPlayers();

        // else if ordered=true
        else if (map.get("ordered") != null && map.get("ordered")[0] == "true") {

            // get the Players in social ranking order
            players = playerEjb.findRankingOrderedPlayers();

        } else {

            String email = request.getParameter("email");
            Player player = playerEjb.findPlayerFromEmail(email);
            if (player != null)
                players.add(player);

        }

        // convert the result in JSON format and put them in the response
        JSONArray array = new JSONArray(players);
        response.getWriter().append(array.toString());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    public PlayerEJB getPlayerEJB() {
        return playerEjb;
    }

    public void setPlayerEJB(PlayerEJB pl) {
        playerEjb = pl;
    }

}

/**
*Servlet实现类getPlayerAPI
* 
*API如下所示:如果不存在任何内容,则检索所有参与者,如果
*ordered=true,如果email=retrieve
*播放给定的电子邮件
*/
@WebServlet(“/api/getPlayers”)
公共类GetPlayerAPI扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
//要在数据库中存储查询的新闻列表
列出参与者名单;
//注入新闻bean以从数据库获取数据
@EJB
PlayerEJB PlayerEJB;
/**
*@参见HttpServlet#HttpServlet()
*/
公共getPlayerAPI(){
超级();
}
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse
*(答复)
*/
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//获取请求参数的映射
HashMap=(HashMap)请求。getParameterMap();
//如果没有给出参数
if(map.size()==0)
//检索数据库中当前的所有标记
players=playerjb.findPlayers();
//else如果排序=true
else if(map.get(“ordered”)!=null&&map.get(“ordered”)[0]=“true”){
//让玩家按社会等级排序
players=playerjb.findRankingOrderedPlayers();
}否则{
字符串email=request.getParameter(“email”);
Player Player=playerEjb.findplayerRomeMail(电子邮件);
如果(玩家!=null)
players.add(player);
}
//将结果转换为JSON格式,并将其放入响应中
JSONArray数组=新JSONArray(玩家);
response.getWriter().append(array.toString());
}
/**
*@参见HttpServlet#doPost(HttpServletRequest,HttpServletResponse
*(答复)
*/
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
//TODO自动生成的方法存根
}
public playerjb getplayerjb(){
返回playerEjb;
}
公共无效集PlayerEJB(PlayerEJB pl){
playerEjb=pl;
}
}
这是PlayerEJB课程

@LocalBean
@Stateless
public class PlayerEJB {
    // Inject the EntityManager to persist the LocationData entity
    @PersistenceContext(unitName = "scuolaTennisNicolaPU")
    private EntityManager em;

    /**
     * This method return the list of Player entities currently stored in the DB
     * 
     * @return a List of News objects
     */
    public List<Player> findPlayers() {
        Query query = em.createNamedQuery("findAllPlayers");
        return query.getResultList();
    }

    /**
     * This method retrieves from the DB the persisted player with the given
     * email
     * 
     * @param email
     *            the email of the player to be retrieved from the DB
     * @return the player with the given email that was persisted in the DB
     */
    public Player findPlayerFromEmail(String email) {

        // create the query
        String s = "SELECT p FROM Player p WHERE p.email = '" + email + "'";
        Query query = em.createQuery(s);

        // query the DB
        List<Player> list = (List<Player>) query.getResultList();
        // if the list is not empty return the first item in the list
        if (list.size() > 0)
            return list.get(0);
        else
            return null;
    }

    /**
     * This method return the list of Player entities currently stored in the DB
     * in social ranking order
     * 
     * @return a List of News objects
     */
    public List<Player> findRankingOrderedPlayers() {
        Query query = em.createNamedQuery("findAllPlayersInRankingOrder");
        return query.getResultList();
    }

    /**
     * This method remove all the Player entities currently stored in the DB
     */
    public void removePlayers() {
        Query query = em.createNamedQuery("removeAllPlayers");
        query.executeUpdate();
    }

    /**
     * This method remove the Player entities currently stored in the DB with a
     * given name and surname;
     * 
     * @param name
     *            the name of the player to be deleted
     * @param surname
     *            the surname of the player to be deleted
     */
    public void removePlayersWithName(String name, String surname) {
        // create the query
        String s = "DELETE FROM Player p WHERE p.name = '" + name + "' AND p.surname = '" + surname + "'";
        Query query = em.createQuery(s);

        query.executeUpdate();
    }

    /**
     * This method remove the Player entities currently stored in the DB with a
     * given name and surname;
     * 
     * @param name
     *            the name of the players to be deleted
     * @param surname
     *            the surname of the players to be deleted
     */
    public void removePlayersWithName(String[] name, String[] surname) {

        if (name.length != surname.length)
            throw new IllegalArgumentException("The two arrays arae not of the same length");
        // create the query
        for (int i = 0; i < name.length; i++) {
            String s = "DELETE FROM Player p WHERE p.name = '" + name[i] + "' AND p.surname = '" + surname[i] + "'";
            Query query = em.createQuery(s);

            query.executeUpdate();
        }
    }

    /**
     * This method remove the Player entities currently stored in the DB with a
     * given name and surname;
     * 
     * @param name
     *            the name of the players to be deleted
     * @param surname
     *            the surname of the players to be deleted
     */
    public void updatePlayersWithEmail(Player player) {

        if (player == null)
            throw new IllegalArgumentException("Argument cannot be null");

        String[] parts = { "p.name", "p.surname", "p.password", "p.age", "p.officialRanking", "p.phone", "p.email", "p.emailChallenger", "p.socialRanking",
                "p.role" };

        for (int i = 0; i < parts.length; i++) {
            String queryString = "UPDATE Player p SET " + parts[i] + "WHERE p.email = '" + player.getEmail();
            Query query = em.createQuery(queryString);
            query.executeUpdate();
        }
    }

    /**
     * This method persist a Player entity
     * 
     * @param data
     *            The Player entity to be persisted
     * @return the same Player entity that has just been persisted
     */
    public Player createPlayer(Player data) {
        em.persist(data);
        return data;
    }

}
@LocalBean
@无国籍
公共类播放机{
//注入EntityManager以持久化LocationData实体
@PersistenceContext(unitName=“scoolennisnicolapu”)
私人实体管理者;
/**
*此方法返回当前存储在DB中的播放器实体列表
* 
*@返回新闻对象列表
*/
公共列表findPlayers(){
Query Query=em.createNamedQuery(“findAllPlayers”);
返回query.getResultList();
}
/**
*此方法从数据库中检索具有给定
*电子邮件
* 
*@param电子邮件
*要从数据库中检索的播放机的电子邮件
*@将已保存在DB中的给定电子邮件返回给玩家
*/
公共播放器FindPlayerRomeMail(字符串电子邮件){
//创建查询
String s=“从播放器p中选择p,其中p.email=”+email+”;
Query Query=em.createQuery;
//查询数据库
List=(List)query.getResultList();
//如果列表不是空的,返回列表中的第一项
如果(list.size()>0)
返回列表。获取(0);
其他的
返回null;
}
/**
*此方法返回当前存储在DB中的播放器实体列表
*按社会等级排列
* 
*@返回新闻对象列表
*/
公开列表FindRankingOrderedPlayer(){
Query Query=em.createNamedQuery(“findAllPlayersInRankingOrder”);
返回query.getResultList();
}
/**
*此方法删除当前存储在DB中的所有播放器实体
*/
公共无效移除玩家(){
Query Query=em.createNamedQuery(“removeAllPlayers”);
query.executeUpdate();
}
/**
*此方法使用
*姓名;
* 
*@param name
*要删除的播放机的名称
*@param姓氏
*要删除的玩家的姓氏
*/
public void removePlayerWithName(字符串名称、字符串姓氏){
//创建查询
String s=“从播放器p中删除,其中p.name='”+name+“'和p.姓氏='“+姓氏+””;
Query Query=em.createQuery;
query.executeUpdate();
}
/**
*此方法使用
*姓名;
* 
*@param name
*要删除的玩家的名称
*@param姓氏
*要删除的玩家的姓氏
*/
public void removePlayerWithName(字符串[]名称,字符串[]姓氏){
if(name.length!=姓氏.length)
抛出新的IllegalArgumentException(“两个数组的长度不相同”);
//创建查询
for(int i=0;i