TLDR; 的JDBI @BindBean
註釋生成與AutoValue一個IllegalAccessException
生成的類型,因爲所生成的類型是包專用,默認情況下無法通過默認使用反射來訪問。使用JDBI @BindBean與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代碼是here。我從Java反思的角度理解,這可以使用setAccessible(true)
來解決,但是這需要PR到JDBI。
所以,問題如下:
是否有辦法來調整自己的代碼,我可以在不產生新的JDBI 映射器綁定的
Foo
型AutoValue_Foo
使用@BindBean
?有沒有辦法讓
@AutoValue
生成類public
。我明白爲什麼這通常不可取 (推動人們使用接口而不是實現)。是在
BindBeanFactory
太執着?它應該利用上可在其他 其原產包外的方法setAccessible(true)
?
您可以使用Lombok的'@ Data'(https://projectlombok.org/features/Data.html)而不是'@ AutoValue'。它在你的類中生成樣板文件,而不是製作實現類型。可能不是你正在尋找的東西,但它對我很好。 – Jorn
@Jorn有趣的知道龍目島的作品。我不幸被鎖定在AutoValue中,但這對其他具有更大靈活性的工程師可能會有用。 – vpiTriumph
請將公關提交給JDBI。我會牧養它。 – qualidafial