2024-11-29 17:06

@zzutligang 只要你不将参数拼接到 sql 就没问题,这里的参数指:字段名、表名、参数值等等一切拼接成 String sql 语句的部分

2024-11-24 12:46

@caoyuan1 是否还需要这个:
if (UploadConfig.whitelist.contains(extName)) {
return true;
}

改为 :

if (UploadConfig.whitelist.contains(extName) || UploadConfig.whitelist.isEmpty()) {
return true;
}

这样全部放行了,安全性就降低了,现在绝大部分对 java 系统的攻击集中在文件上传 + sql 注入

2024-11-22 14:09

白名单、黑单名提供了配置,可以自行控制,删除所有白名单就相当于让位于你业务自己控制

2024-11-18 20:20

@北流家园网 在 baseController 覆盖一下 getModel 系列的方法,支持一下这个数组的注入

injectModel 回调了 getModel 方法,很方便扩展

2024-11-18 14:49

先用一下 json 注入,这个注入数组非常方便,或者暂时换种方式,暂时不用数组

form 表单的一个字段传递数组这种方式本来就用得少

2024-11-14 15:24

利用生成器生成 base model、model, json 工具会针对 getter、setter 方法自动处理成驼峰

2024-11-14 11:28

jfinal 自身就有这些转换的代码可以参考,仔细看一下这里:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/core/paragetter/BeanGetter.java

2024-11-10 10:41

@杜福忠 同学的方案来了: https://jfinal.com/share/2764

2024-11-10 10:40

这个功能有不少同学需要,相当有价值,点赞 + 收藏, 以后有同学问,直接上链接

2024-11-07 17:09

多数据源事务是 "分布式事务" 的范畴, jfinal 并不支持

"分布式事务" 很麻烦,而且性能不高,如果一定要支持的话,找一找中间件,例如 sharding jdbc , 搜索一下,或者问一下 chat gpt "sharding jdbc 分布式事务"。

专业的人干专业的事,分布式事务交给这些成熟的中间件去解决。 这类组件对开发是透明的,配置好之后,给 jfinal 的仍然是数据源,jfinal 这边代码不变

2024-11-04 14:54

最近几年好些微服务实践的用户和朋友在从微服务转回集群模式

微服务成本极高,如果你在大厂有钱、有人力、有快速动态扩容需求那无可厚非

绝大部分公司用集群是省事的方案,mysql、redis、jfinal 三类节点做好集群就好

jfinal 在微服务大火的头两年确实有过进入这个战场的冲动,甚至还写了上万行的代码,但最后忍住没参与,因为这与 jfinal 定位不符, jfinal 建立的是一个小而美的世界

当然,小而美并不是说只适合小系统,而是说 jfinal 自身是小而美的

2024-10-30 17:41

第一套数据库连接池添加在前,会成为默认数据源
ActiveRecordPlugin arp1 = new ActiveRecordPlugin("db1", dp1);
me.add(arp1);

用的时候不需要指定,直接用:
Db.find(...)

2024-10-30 15:28

看一下私信,有微信群,有资源可以下载,社区的新作品正在大步推进,开发更快、更丝滑

2024-10-26 14:58

问一下 chat gpt ,回复可以参考一下,虽然结果出现了了幻觉,但思路值得借签,它提出继承 dialect, 其实应该是要继承 ModelBuilder、RecordBuilder,然后处理一下获取数的地方:

是的,您可以在 JFinal 中通过自定义 Dialect(方言)来解决从 SQLite 数据库读取 Blob 类型数据的问题,而无需修改 JFinal 的源代码。

问题原因:

SQLite JDBC 驱动程序未实现 getBlob 方法,因此当 JFinal 使用默认的 getBlob 方法读取 Blob 数据时,会抛出 “not implemented by SQLite JDBC driver” 的异常。

解决方案:

创建自定义 Dialect:

您可以创建一个自定义的 Dialect 类,继承自 JFinal 提供的 SQLiteDialect 或直接继承 com.jfinal.plugin.activerecord.dialect.Dialect。

java
复制代码
public class CustomSQLiteDialect extends SQLite3Dialect {
@Override
public Object getValue(ResultSet rs, String colName, Class type) throws SQLException {
if (type == byte[].class) {
// 使用 getBytes 方法读取 Blob 数据
return rs.getBytes(colName);
}
return super.getValue(rs, colName, type);
}
}
注册自定义 Dialect:

在您的 JFinal 配置中,注册您自定义的 Dialect:

java
复制代码
ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
arp.setDialect(new CustomSQLiteDialect());
me.add(arp);
使用自定义类型映射(可选):

如果需要,您还可以自定义类型转换器,以确保 Blob 类型的数据被正确地映射为 byte[]:

java
复制代码
public class CustomTypeConverter extends TypeConverter {
@Override
public Object convert(Class type, Object value) {
if (value instanceof byte[]) {
return value;
}
return super.convert(type, value);
}
}
然后在配置中设置自定义的类型转换器:

java
复制代码
arp.setTypeConverter(new CustomTypeConverter());
总结:

通过自定义 Dialect,您可以控制 JFinal 在从 ResultSet 中读取数据时的行为,使用 getBytes 或 getBinaryStream 方法来读取 Blob 数据类型。这种方式无需修改 JFinal 的源代码,且解决了 SQLite JDBC 驱动未实现 getBlob 方法的问题。

2024-10-24 11:42

ThreadPoolKit.shutdown() 是你整个项目停止服务的时候调用一次,不调用也没关系

在提交任务后,不能调用该方法