Java 将JDBI@BindBean与AutoValue一起使用
TLDR强> JDBIJava 将JDBI@BindBean与AutoValue一起使用,java,reflection,jdbi,auto-value,Java,Reflection,Jdbi,Auto Value,TLDR JDBI@BindBean注释使用自动值生成的类型生成一个IllegalAccessException,因为生成的类型是包私有的,默认情况下不能使用反射进行访问 JDBI是否不灵活,或者是否有通过AutoValue的解决方法?(完整问题如下) 快速背景 我试图将JDBI@BindBean注释与一个类型一起使用,该类型的源代码是使用AutoValue生成的 package com.example; @AutoValue public abstract class Foo { pub
@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
}
注意这个类是包私有的
现在,如果我尝试使用@BindBean
,例如:
@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
由于AutoValue\u Foo
是包私有的,并且BindBeanFactory
使用反射,如果尝试使用AutoValue\u Foo
类型调用find
,结果是:
java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"
相关的JDBI代码如下所示。我从Java反射的角度理解,这可以通过使用setAccessible(true)
来解决,但这需要对JDBI进行PR
问题如下:
@BindBean
键入AutoValue\u-Foo
,而不创建新的JDBI
制图员@AutoValue
生成
public
。我理解为什么这通常是不可取的
(推动人们使用接口,而不是实现)BindBeanFactory
是否过于死板?它应该利用吗
setAccessible(true)
在其他可用方法上
在他们的原始包装之外JDBI的2.71版将包括使用
type
字段为@BindBean
指定类型令牌的功能。此类型标记将允许指定用于对提供的参数进行反射调用的类型
@SqlQuery(“从baz中选择*,其中bar=:foo.bar”)
条件查找(@BindBean(value=“foo”,type=foo.class)foo-foo);
使用此技术,您可以消除上述
IllegalAccessException
。您可以使用Lombok的@Data
()而不是@AutoValue
。它在类中生成样板文件,而不是生成实现类型。也许不是你想要的,但它对我来说很有用。@Jorn很有兴趣知道龙目山的工作原理。不幸的是,我被锁定在AutoValue中,但这可能对其他具有更大灵活性的工程师有用。请向JDBI提交PR。我会引导它通过。