【问题标题】:Class Exception Issues (is in unnamed module of loader)类异常问题(在加载程序的未命名模块中)
【发布时间】:2021-07-02 21:51:03
【问题描述】:

我真的不知道是什么导致了这个错误,我只知道当我尝试在我的 servlet 中实例化一个 DAO 对象并使用请求调度程序发送对象时发生这种情况。

SRVE0777E: Exception thrown by application class 'com.projecteden.mainmenu.SelectSurvivorData.doGet:27'
java.lang.ClassCastException: class com.projecteden.livingobjects.entities.SurvivorPO cannot be cast to class com.projecteden.livingobjects.entities.SurvivorPO (com.projecteden.livingobjects.entities.SurvivorPO is in unnamed module of loader com.ibm.ws.classloading.internal.AppClassLoader @3a649edc; com.projecteden.livingobjects.entities.SurvivorPO is in unnamed module of loader com.ibm.ws.classloading.internal.AppClassLoader @3c834c19)
at com.projecteden.mainmenu.SelectSurvivorData.doGet(SelectSurvivorData.java:27)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:686)
at [internal classes]

package com.projecteden.mainmenu;

import java.io.IOException;

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.projecteden.livingobjects.DAO.SurvivorDAO;

@WebServlet("/GetSurvivorData")
public class SelectSurvivorData extends HttpServlet 
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    SurvivorDAO getList = new SurvivorDAO();
    response.setContentType("text/html;charset=UTF-8");
    request.setAttribute("test", getList.getAllSurvivors().get(0).getName());
    
    request.getRequestDispatcher("WebPages/MainMenu/SelectPlayer.jsp").forward(request, response);
}

}
package com.projecteden.livingobjects.DAO;

import java.util.List;

import com.projecteden.livingobjects.entities.SurvivorPO;




public class SurvivorDAO extends LivingObjectsEM
{

    
    public List<SurvivorPO> findWithId(String id) 
     {      
        return em.createQuery(
            "SELECT c FROM SurvivorPO c WHERE c.id LIKE :id")
            .setParameter("id", id)
            .setMaxResults(1)
            .getResultList();
     }
     
    
    public List<SurvivorPO> getAllSurvivors() 
     {      
        return em.createQuery(
            "SELECT c FROM SurvivorPO c")
            .setMaxResults(10)
            .getResultList();
     }
      
}
package com.projecteden.livingobjects.entities;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "survivor_stats")
public class SurvivorPO
{
    @Id
    @Column(name ="id")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="SurvivorIdGenerator")
    @SequenceGenerator(name="SurvivorIdGenerator", sequenceName="SurvivorSequencesId")
    private int id;
    
    @Column(name ="name")
    private String name;
    
    @Embedded
    private StatsPO stats;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public StatsPO getStats() {
        return stats;
    }

    public void setStats(StatsPO stats) {
        this.stats = stats;
    }

    @Override
    public String toString() {
        return "HeroPO [id=" + id + ", name=" + name + ", stats=" + stats + "]";
    }
    
    

}

至于我正在使用的其他东西: 这是一个包含 JPA2.2、JSP、Bootstrap5、MySQL、Dynamic Web Module 4.0、Java16、JS 的 Maeven 项目 1.0,和 EclpipseLink

如果您需要任何进一步的说明,请随时询问。

【问题讨论】:

    标签: java jsp jpa eclipselink


    【解决方案1】:

    对于遇到类似问题的任何人,我已经设法解决了这个问题。根据我的理解(这并不完美),Liberty Web Sphere 在某种程度上有自己的类加载器,这似乎与我的 DAO 和 PO 冲突,它们可能一直在使用不同的类加载器。我的问题的解决方案至少是进入 Liberty Runtime/servers/WebSphere/server.xml 下的 WebSphere 服务器设置

    打开此文件后,应该有一个带有几个不同窗口的 GUI,其中显示服务器配置,打开后列表中应该有一个名为“Web 应用程序:'项目名称'”的项目,里面应该有一个设置调用 Classloader ,我将其更改为 $(server.config.dir) ,更改后我的项目似乎再次正常运行。

    请记住,我专门使用 Eclipse、Liberty Web Sphere、Eclipse Link 并处理 Maevan / 动态 Web 应用程序。我也不知道这是否是最佳实践,但对于一个您不打算在任何地方发布的简单项目,我认为这个解决方案会很好。这也是一个非常具体的问题,具有非常具体的解决方案,因此在类似错误的类似情况下,这可能有效,也可能无效。

    如果您碰巧遇到此错误,但它指的是两个单独的类,那么它更有可能基于我发现您正在调用 Obj1 obj = new Obj2();该错误实际上与 Obj2 与 Obj1 不兼容有关。但是如果你有 Obj1 obj = new Obj1;如果出现此错误,那么我所看到的可能是类加载器错误。

    祝其他遇到此错误的人好运,因为天知道这让我头疼了 6 个小时,只是为了解决这个问题。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2020-05-16
      • 2021-07-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多