TLDR;JDBI @BindBean
注释使用自动生成的类型生成 IllegalAccessException
,因为生成的类型是包私有的,默认情况下无法使用反射进行访问。
JDBI是不灵活的还是有通过AutoValue的解决方法?(以下是完整的问题)
快速背景
我正在尝试使用JDBI @BindBean
注释,其类型的源代码是使用AutoValue生成的。
package com.example;
@AutoValue
public abstract class Foo {
public String getBar();
}
问题是生成的代码看起来像:
package com.example;
@AutoValue
class AutoValue_Foo extends Foo {
private final String bar;
@Override
public String getBar() {
return this.bar;
}
// toString, equals, hashCode
}
请注意,类是包私有的!
现在,如果我尝试使用< code>@BindBean,例如:
@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
因为AutoValue_Foo
是包私有的,并且BindBean工厂
使用反射,如果尝试使用AutoValue_Foo
类型调用查找
,结果是:
java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"
相关的JDBI代码在这里。我从Java反射的角度理解,这可以使用setAccessible(true)
来解决,但这需要JDBI的PR。
所以问题如下:
>
有没有一种方法可以重构我的代码,使我可以使用<code>@BindBean</code>绑定<code>AutoValue_Foo</code>类型的<code>Foo</code>,而无需创建新的JDBI映射器?
有没有办法让@AutoValue
生成公共
类。我理解为什么这通常是不可取的(促使人们使用接口而不是实现)。
< code>BindBeanFactory是不是太不灵活了?它是否应该对方法使用< code>setAccessible(true),否则这些方法在它们的原始包之外是可用的?
JDBI 2.71版将包括使用<code>type</code>字段为<code>@BindBean</code>指定类型标记的功能。此类型标记将允许指定用于针对提供的参数进行反射调用的类型。
@SqlQuery("选择*从baz其中bar=:foo.bar")条件查找(@BindBean(value="foo", type=Foo.class)Foo foo);
使用此技术,您可以消除上述非法访问异常
。
我试图执行以下代码: 得到了一个相当无用的错误: 我的代码基于JDBI Developer Guide示例: 以下代码运行良好: 我做错了什么? jdbi版本:3.25.0 jdk:16
每https://github.com/google/guice/wiki/AssistedInject, 假设我有一个接口,实现类和另一个接口,我与FactoryModuleBuilder一起使用- 是否可以将自动值用于 ?我担心的是 将是抽象的,工厂模块将无法实例化它。如果我传递给工厂模块,它就不会有 注释。
是否对两个函数进行了净化/对SQL注入安全?例如,请考虑以下内容: 我目前的理解是,将字符串按原样直接插入到查询中,但进行净化处理。因此,如果我们控制和tableName,并且只有参数是用户输入,那么就可以了。
jDBI 提供一个 Java 简单操作接口, 它不是一个抽象层而是一个类库是的公共的操作更简单、还有能力去做一些更复杂的操作。 JDBI 是 Java 的 SQL 便捷操作库,尝试使用集合,beans 等等来暴露 Java 中的关系型数据库,可以维护相同级别的 JDBC。提供两个不同样式的 APIs:fluent 和 sql object。 Fluent API // using in-memor
我正在使用创建React应用程序,并尝试使用提供的组件。 我遇到的问题似乎涉及导入名为
我有两个像这样的jdbi刀: 我想在一个事务中执行两个道的保存,例如: 在Spring中,我使用了@transactional注释。我可以使用dropwizard和jdbi做什么?