多数据源配置属性名大小写不敏感setContainerFactory()的问题

jfinal5.1.9版本,启动类中配置了多个数据源,将最后一个数据源配置属性名(字段名)大小写不敏感,结果导致从前一个数据源获取数据时,属性字段也变小写了。

setContainerFactory()这个设置是全局生效的吗?请教下这个该如何调整数据源各自的设置互不影响? @JFinal


代码如下:

        public void configPlugin(Plugins me) {
        
        ...
        
        //模板库
        DruidPlugin druidPluginDw = getDruidPluginDw();
        druidPluginDw.addFilter(wallFilter);
        druidPluginDw.addFilter(new StatFilter());
        me.add(druidPluginDw);
        ActiveRecordPlugin arpDw = new ActiveRecordPlugin(Const.DWDBID_TEMP, druidPluginDw);
        arpDw.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
        _MappingKitDw.mapping(arpDw);
        me.add(arpDw);
        arpDw.setShowSql(p.getBoolean("showSql", false));
        arpDw.getEngine().setToClassPathSourceFactory();

        //公用库
        DruidPlugin druidPluginDc = getDruidPluginDc();
        druidPluginDc.addFilter(wallFilter);
        druidPluginDc.addFilter(new StatFilter());
        me.add(druidPluginDc);
        ActiveRecordPlugin arpDc = new ActiveRecordPlugin(Const.DCDBID_DATA, druidPluginDc);
        arpDc.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
        // 这句代码会导致从上边“模板库”获取数据时,属性字段名都变成小写了 ???
        arpDc.setContainerFactory(new CaseInsensitiveContainerFactory(true)); 
        //_MappingKitDc.mapping(arpDc);
        me.add(arpDc);
        arpDc.setShowSql(p.getBoolean("showSql", false));
        arpDc.getEngine().setToClassPathSourceFactory();
        
        ...
        
        }


评论区

JFinal

2024-06-14 13:27

new CaseInsensitiveContainerFactory(true)
改为
new CaseInsensitiveContainerFactory()
即可

如果希望转成大写,改为
new CaseInsensitiveContainerFactory(false)

JFinal

2024-06-14 13:54

看一下源码 CaseInsensitiveContainerFactory.java , 单步调试一下,而且这个也可以扩展,扩展 ContainerFactory 接口

liugz

2024-06-14 13:56

@JFinal 将公用库这个数据源改成new CaseInsensitiveContainerFactory(),那从这个数据源取数时,属性名都就都成大写了(Oracle数据库)。而实际业务需要这个数据出来的都是小写的。 看有没有办法将这个设置改成每个数据源各管各的,互不影响?

liugz

2024-06-14 14:15

@JFinal 看了下CaseInsensitiveContainerFactory.java还是不知道从何下手,求教求教 o(╥﹏╥)o

JFinal

2024-06-14 14:49

@liugz 这个就是可以各个数据源各管各的,可以分别配置:
arp1. setContainerFactory(...)
arp2. setContainerFactory(...)
arp3. setContainerFactory(...)

注意看源码,参数为 true/false 决定是 jfinal 在框架层面是否要帮你转成大写或小写,无参时 jfinal 不干预

所以,CaseInsensitiveContainerFactory 构造方法的参数,有三种用法,分别是:无参、true、false, 都试一下

liugz

2024-06-14 14:58

@JFinal 我这边按下面方式设置,测试了最后1个的设置会影响到第1个。
先设置:
arp1.setContainerFactory(new CaseInsensitiveContainerFactory());
再设置:
arp2.setContainerFactory(new CaseInsensitiveContainerFactory(true));
那么,arp1也会变成小写了。

liugz

2024-06-14 15:01

扩展了一个MyCaseInsensitiveContainerFactory,原样复制的CaseInsensitiveContainerFactory.java里的代码。
再设置:arp2.setContainerFactory(new MyCaseInsensitiveContainerFactory(true));
刚这样弄下解决的。

JFinal

2024-06-14 15:12

@liugz CaseInsensitiveContainerFactory 的配置在每个数据源中是独立的,你在这个类里面打断点调试一下看看,应该是别的原因造成的

JFinal

2024-06-14 15:13

我看了一下源码,看到了这个:
private static Boolean toLowerCase = null;

证明还真是共享的,我一会去除 static 这个关键字

JFinal

2024-06-14 15:26

已经改进了这里:
https://gitee.com/jfinal/jfinal/commit/3cdab9ebd945d96002c13ea28c007f1c0fdd8e24

目前,你可以通过复制我刚刚提交的代码,改个类名,去实现独立配置的需求

JFinal

2024-06-14 15:28

你代码中的这些不再需要,因为后来的 jfinal 版本早就默认是这样的配置了:
arpDc.getEngine().setToClassPathSourceFactory();

liugz

2024-06-14 15:39

@JFinal 好的,非常感谢波总

JFinal

2024-06-14 17:47

@liugz 谢谢你这么多年对 jfinal 的支持

热门反馈

扫码入社