TLDR;
JDBI@BindBean
注解会生成一个IllegalAccessException
带有 AutoValue 的生成类型,因为生成的类型是包私有的,并且默认情况下无法使用反射访问。
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
}
注意这个类是包私有的!
现在,如果我尝试使用@BindBean
,例如:
@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
因为AutoValue_Foo
是包私有的,并且BindBeanFactory
使用反射,如果尝试find
使用AutoValue_Foo
类型调用,结果是:
java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"
相关的 JDBI 代码在这里。我从 Java 反射的角度理解,这可以使用来解决,setAccessible(true)
但这需要 JDBI 的 PR。
所以问题如下:
有没有办法重组我的代码,我可以在不创建新的 JDBI 映射器的情况下绑定
Foo
类型AutoValue_Foo
使用?@BindBean
有没有办法
@AutoValue
生成public
. 我理解为什么这通常是不可取的(推动人们使用接口而不是实现)。是不是
BindBeanFactory
太不灵活了?它是否应该使用setAccessible(true)
在其原始包之外可用的方法?