java - 将 JDBI @BindBean 与 AutoValue 结合使用

标签 java reflection jdbi auto-value

TLDR; JDBI @BindBean注释生成 IllegalAccessException使用 AutoValue 生成的类型,因为生成的类型是包私有(private)的,默认情况下无法使用反射访问。

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
}

注意这个类是包私有(private)的!

现在,如果我尝试使用 @BindBean ,例如:

@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);

因为 AutoValue_Foo是私有(private)包,BindBeanFactory使用反射,如果尝试调用 findAutoValue_Foo类型,结果是:

java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"

相关的JDBI代码是here .我从 Java 反射的角度理解,这可以使用 setAccessible(true) 解决。但这需要向 JDBI 提交 PR。

所以问题如下:

  1. 有没有办法重组我的代码,使我可以绑定(bind) Foo的 输入 AutoValue_Foo使用 @BindBean无需创建新的 JDBI 映射器?

  2. 有没有办法得到@AutoValue生成的类是 public .我明白为什么这通常是不可取的 (促使人们使用界面而不是实现)。

  3. BindBeanFactory太不灵活?它应该利用 setAccessible(true)在其他可用的方法上 在他们的原始包裹之外?

最佳答案

JDBI 2.71 版将包括使用 type 字段为 @BindBean 指定类型标记的能力。此类型标记将允许指定用于对提供的参数进行反射调用的类型。

@SqlQuery("select * from baz where bar = :foo.bar") 条件查找(@BindBean(value="foo", type=Foo.class) Foo foo);

使用此技术,您可以消除上述 IllegalAccessException

关于java - 将 JDBI @BindBean 与 AutoValue 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009266/

相关文章:

java - 如何获取 JComponent 的顶级容器?

c# - 如何从枚举中获取数值?

Java 将字段反射分配为 null 导致 IllegaArgumentException

java - Spring Boot 自定义 Bean 加载器

java - 使用 OpenCSV 根据特定行值查找 csv 文件的确切部分

java - 删除并添加回 JPanel 后,MouseEvent 不会在 JList 中触发

java - 通过动态传递日期获取总工作日日期

wpf - 如何获取 System.Windows.Controls.Primitive.PopupRoot 类型?

java - JDBI:如何将查询映射为对象列表