社区首页 >问答首页 >defineClass用于ActiveJdbc模型抛出异常

defineClass用于ActiveJdbc模型抛出异常
EN

Stack Overflow用户
提问于 2017-01-10 03:53:36
回答 2查看 423关注 0票数 0

当我试图使用defineClass (findClass URLClassLoader或自实现ClassLoader)连接我的模型类时,会出现异常。

正在加载任何其他方法,但不允许动态重载类。

代码语言:javascript
代码运行次数:0
复制
@Table("accounts")
@BelongsToParents({
  @BelongsTo(parent = Customer.class, foreignKeyName = "Customer"),
  @BelongsTo(parent = Currency.class, foreignKeyName = "Currency")
})
public class Account extends Document{
  public static DocFields prepareDocument(...){

    ... fields = new ...(getTableName());
    ...
  }
...
}

public abstract class Document extends Model{
  public static DocFields prepareDocument(Session session){
    return null;
  }
  ...
}

public class DynCLoader extends ClassLoader {

  public DynCLoader(ClassLoader parentClass) {
    super(parentClass);
  }
  @Override
  public Class<?> loadClass(String className) throws ClassNotFoundException {
    if(StrFuncs.isEmpty(className)){
      throw new ClassNotFoundException("Ошибка в модуле DynCLoader, в функцие loadClass. Детали: className is empty");
    }
    try {
      ...
      if(...){ // Загрузка нового, неопределенного класса
        Class<?> clazz;
        try{
          String url = "file:"+...+".class";
          URL myUrl = new URL(url);
          URLConnection connection = myUrl.openConnection();
          InputStream input = connection.getInputStream();
          ByteArrayOutputStream buffer = new ByteArrayOutputStream();
          int data = input.read();
          while(data != -1){
              buffer.write(data);
              data = input.read();
          }
          input.close();
          byte[] classData = buffer.toByteArray();
          clazz = defineClass(className, classData, 0, classData.length);
          ...
          return clazz;
        }
        catch (FileNotFoundException ex) {
          clazz = Class.forName(className);
          ...
          return clazz;
        }
        catch (MalformedURLException ex) {
          ...
          return null;
        }
        catch (Throwable ex) {
          try{
            clazz = Class.forName(className, true, this);
            return clazz;
          }
          catch(ClassNotFoundException oErr){
            ...
          }
          ...
          return null;
        }
      }
      else if(...) // Загрузка системного класса
        return Class.forName(className);
      else{
        return Class.forName(className, true, this);
      }
    }
    catch (ClassNotFoundException ex) {
      throw ex;
    }
  }
}

日志:

代码语言:javascript
代码运行次数:0
复制
[main] INFO org.javalite.activejdbc.DB - Opened connection: com.mysql.jdbc.JDBC4Connection@49fd9b
[main] INFO org.javalite.activejdbc.ConnectionsAccess - Attached connection named: default: to current thread: com.mysql.jdbc.JDBC4Connection@49fd9b. Extra info: jdbc:mysql://127.0.0.1:3306/***
[main] INFO org.javalite.activejdbc.Configuration - Load models from: file:/***/Product/***/Server/target/classes/activejdbc_models.properties
[main] INFO org.javalite.activejdbc.Configuration - Load models from: file:/***/Kernel/Server/target/classes/activejdbc_models.properties
[main] INFO org.javalite.activejdbc.Registry - Registered model: class kz.mwb.qupris.server.data.model.Account
***
[main] INFO org.javalite.activejdbc.Registry - Registered model: class kz.mwb.qupris.server.data.model.User
***
[main] INFO org.javalite.activejdbc.Registry - Fetched metadata for table: accounts
***
[main] INFO org.javalite.activejdbc.Registry - Fetched metadata for table: usertable
***
[main] INFO org.javalite.activejdbc.MetaModel - Association found: Customer  ----------<  Account, type: has-many
[main] INFO org.javalite.activejdbc.MetaModel - Association found: Account  >----------  Customer, type: belongs-to
***
[main] INFO org.javalite.activejdbc.cache.QueryCache - MISS, "SELECT * FROM *** WHERE ***
***
[Thread-20] INFO org.javalite.activejdbc.DB - Opened connection: com.mysql.jdbc.JDBC4Connection@1db686
[Thread-20] INFO org.javalite.activejdbc.ConnectionsAccess - Attached connection named: default: to current thread: com.mysql.jdbc.JDBC4Connection@1db686. Extra info: jdbc:mysql://127.0.0.1:3306/***
[Thread-20] INFO org.javalite.activejdbc.LazyList - Query: "SELECT * FROM *** WHERE ***, took: 5 milliseconds
***
00:42:52 > 34 > UserLib > ERROR > java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at kz.mwb.qupris.server.tool.loader.Include.processMethod(Include.java:111)
    at kz.mwb.qupris.server.userlib.doDoc.initMod(doDoc.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at kz.mwb.qupris.server.tool.loader.Include.processMethod(Include.java:111)
    at kz.mwb.qupris.server.tool.loader.Include.EvalFunction(Include.java:31)
    at kz.mwb.qupris.server.engine.ModEngine.MProcess(ModEngine.java:133)
    at kz.mwb.qupris.server.engine.ModEngine.IProcess(ModEngine.java:85)
    at kz.mwb.qupris.server.engine.ModEngine.XProcess(ModEngine.java:203)
    at kz.mwb.qupris.server.engine.Task.ProcessRequest(Task.java:396)
    at kz.mwb.qupris.server.engine.Task.GateWayLine(Task.java:162)
    at kz.mwb.qupris.server.engine.Task.ConnectToGateWay(Task.java:326)
    at kz.mwb.qupris.server.engine.Task.run(Task.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.javalite.activejdbc.DBException: failed to find metamodel for class kz.mwb.qupris.server.data.model.Account. Are you sure that a corresponding table  exists in DB?
    at org.javalite.activejdbc.Registry.getTableName(Registry.java:414)
    at org.javalite.activejdbc.ModelDelegate.tableNameOf(ModelDelegate.java:326)
    at kz.mwb.qupris.server.data.model.Account.getTableName(Account.java:2831)
    at kz.mwb.qupris.server.data.model.Account.prepareDocument(Account.java:23)
    ... 20 more
EN

回答 2

Stack Overflow用户

发布于 2017-01-11 08:05:42

我把getTableName换成了MetaModels.java,它成功了!

代码语言:javascript
代码运行次数:0
复制
String getTableName(Class<? extends Model> modelClass) {
    MetaModel mm = null;
    for (Map.Entry<Class<? extends Model>, MetaModel> entry : metaModelsByClass.entrySet()){
      if(modelClass.getName().equals(entry.getKey().getName()))
        mm = entry.getValue();
    }
    return mm == null ? null : mm.getTableName();
}

原功能:

代码语言:javascript
代码运行次数:0
复制
String getTableName(Class<? extends Model> modelClass) {
    MetaModel mm = metaModelsByClass.get(modelClass);
    return mm == null ? null : mm.getTableName();
}

我建议不要将类用作键或更改选择逻辑。

票数 1
EN

Stack Overflow用户

发布于 2017-01-11 13:14:42

这是框架中与不同类加载器加载的模型相关的一个小错误。修复是由请求者提供的,创建了问题:https://github.com/javalite/activejdbc/issues/570,并且已经解决了。

您可以使用修补程序从:http://repo.javalite.io/org/javalite/activejdbc/2.0-SNAPSHOT/获取最新的快照。

谢谢你的贡献!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41568228

复制
相关文章
C# WPF MVVM模式下在主窗体显示子窗体并获取结果
在winform中打开一个新的子窗体很简单,直接实例化窗体并show一下就可以:
用户9127601
2021/11/01
1.8K0
窗体显示
这个是可以点击的 主要是没有那个事件绑定所以没有啥事只有点击之后啥都没有啦 我每一部分都用的一个主程序 所以看着会比较乱但是不影响复习 源代码奉上
用户8447427
2022/08/18
1.4K0
窗体显示
Oracle sqlplus 查询结果显示优化
使用Oracle sqlplus 进行查询时经常会碰到查询结果显示问题,字段和查询结果难以直接对应显示。
全栈程序员站长
2022/09/13
2K0
6.1.1-Hue上SQL查询结果显示不全异常分析
2.准备数据并导入到该Hive表中,注意我们准备的数据第四个字段即s4的值特别长,约有5000多个字符。
Fayson
2019/05/22
3.9K3
在OQL上使用UPDLOCK锁定查询结果,安全的更新实体数据
SqlServer查询记录的时候提供多种锁定方式,其中UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改。 有时候我需要控制某条记录在我读取后就不许再进行更新,那么我就可以将所有要处理当前记录的查询都加上更新锁,以防止查询后被其它事务修改.将事务的影响降低到最小。假如不这样做,将整个表锁定,这种做法将严重影响了性能。
用户1177503
2018/08/20
1.8K0
在Office应用中打开WPF窗体并且让子窗体显示在Office应用上
在.NET主程序中,我们可以通过创建 ExcelApplication 对象来打开一个Excel应用程序,如果我们想在Excle里面再打开WPF窗口,问题就不那么简单了。 我们可以简单的实例化一个WPF窗体对象然后在Office应用程序的窗体上打开这个新的WPF窗体,此时Office应用的窗体就是WPF的宿主窗体。然后宿主窗体跟Office应用并不是在一个UI线程上,子窗体很可能会在宿主窗体后面看不到。这个时候需要调用Win32函数,将Office应用的窗体设置为WPF子窗体的父窗体,这个函数的形式定义如下
用户1177503
2018/05/03
1.6K0
0640-6.1.1-Hue上SQL查询结果显示不全异常分析-补充
2.准备数据并导入到该Hive表中,注意我们准备的数据第四个字段即s4的值特别长,约有5000多个字符。
Fayson
2019/05/29
1.2K0
设置sqlplus不显示除查询结果外的信息
背景:客户提出一个需求,写SQL脚本的时候,内容是拼接的,如何将这个拼接SQL执行的结果取出来调用执行呢? 我想到的方案是先把结果取出来,存为一个中间文件,再调用该文件即可。 知识点:如何将sqlplus结果中的无关信息都去掉? 可以使用sqlplus -s进入调用拼接SQL脚本,脚本中配合使用set设定相关属性即可实现。下面举一个简单的示例来说明:
Alfred Zhao
2019/05/24
1.3K0
代码分享:高亮显示鼠标移动到的用户窗体上的控件
这是在vbaexpress.com上找到的一段代码,非常有意思,当鼠标移动到用户窗体中的控件上时,该控件会高亮显示。这可以让我们将用户窗体界面设计得更好。
fanjy
2022/06/04
1.1K0
代码分享:高亮显示鼠标移动到的用户窗体上的控件
MySQL 在查询结果中记录行号
在其他的关系型数据库中,都有rownum这类型的内置函数来提供查询结果的行号,但是MySQL没有,阿福也一直觉得奇怪。
用户2353021
2020/05/09
6.6K0
Matlab进行一些符号计算的结果如何显示在屏幕上?
1、点击[命令行窗口] 2、按<Enter>键 3、点击[命令行窗口] 4、按<Enter>键 5、点击[命令行窗口] 6、按<Enter>键
裴来凡
2022/05/28
3.2K0
Matlab进行一些符号计算的结果如何显示在屏幕上?
设置WPF窗体全屏显示:
//全屏代码: private void Window_Loaded(object sender, RoutedEventArgs e) { // 设置全屏 this.WindowState = System.Windows.WindowState.Normal; this.WindowStyle = System.Windows.WindowStyle.None; this.ResizeMode = System.Windows.ResizeMode.NoResize;
hbbliyong
2018/03/05
3.9K0
phpMySQL查询全部数据并在HTML表格中显示结果
mysqli_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。
哆哆Excel
2022/10/25
7.1K0
phpMySQL查询全部数据并在HTML表格中显示结果
双色球开奖结果查询之请求问题
上篇讲到请求 开彩API 但是返回数据中途稍微有点慢,而现在将其舍去了,直接从 中国福利彩票 网 抓取数据,看效果感觉会比开彩快点!效果图如下:
游离于山间之上的Java爱好者
2022/08/09
4120
双色球开奖结果查询之请求问题
MAT分析dump文件显示大小比jmap查询结果小
有朋友向我吐槽,她在一台测试机器上调试,使用jmap查看堆内存占用时,发现年轻代+老年代占用的内存,和dump下堆转储文件使用MAT分析显示的内存不一样,百思不得其解。重现现象如下:
Java架构师必看
2021/11/29
3.5K0
MAT分析dump文件显示大小比jmap查询结果小
在Google搜索结果中显示你网站的作者信息
前几天在卢松松那里看到关于在Google搜索结果中显示作者信息的介绍,站长也亲自试了一下,目前已经成功。也和大家分享一下吧。
星哥玩云
2022/08/13
2.4K0
在Google搜索结果中显示你网站的作者信息
mongodb与sql在查询上的区别
之前在“这个场景更适合使用NoSQL”文章中通过和SQL的对比 介绍了NOSQL数据存储结构的特点,一位朋友看后希望再介绍下NOSQL查询方面的特点 这里以NOSQL中比较典型的mongodb数据库为例,先从用法上看下mongodb的操作方式,以后会更深入的介绍mongodb查询方面的细节 下面从3个方面看下mongodb的查询方式 (1)简单查询 类似于sql的 select * from table; (2)条件查询 类似于sql的 select * from table where
dys
2018/04/02
2K0
c#子窗口与父窗口_主窗体控制子窗体的显示
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170914.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2.6K0
点击加载更多

相似问题

如何修复‘原始错误:’命令'‘与代码1一起退出’;Stderr:'';代码:‘1’

21

命令"Gulp“与代码1一起退出。

17

Dotfuscator命令与代码1一起退出

13

我如何解决它‘错误命令失败与退出代码1’RN

111

错误MSB3073:与代码1一起退出的命令“”

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档