使用带有AutoValue的JDBI@BindBean



TLDRJDBI @BindBean注释生成具有AutoValue生成类型的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_Foo是包专用的,而BindBeanFactory使用反射,所以如果尝试用AutoValue_Foo类型调用find,结果是:

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

此处提供了相关的JDBI代码。我从Java反射的角度理解,这可以使用setAccessible(true)解决,但这需要对JDBI进行PR。

因此问题如下:

  1. 有没有一种方法可以重组我的代码,在那里我可以绑定的Foo使用@BindBean键入AutoValue_Foo而不创建新的JDBI映射器?

  2. 有没有一种方法可以让@AutoValue生成public。我理解为什么这通常是不可取的(促使人们使用接口而不是实现)。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新