当前位置: 首页 > 知识库问答 >
问题:

使用带有AutoValue的JDBI@BindBean

林夕
2023-03-14

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),否则这些方法在它们的原始包之外是可用的?

  • 共有1个答案

    汤枫涟
    2023-03-14

    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做什么?