みなさん、こんにちは。javassistライブラリで手を試していて、乗り越えられないハードルに出くわしたようです。問題は、ジャージのResourceConfigクラスを拡張する構成クラスを動的に作成したいことと、コンストラクターでパッケージとファクトリオブジェクトをインジェクション用に登録したいことです。しかし、エラーが発生するたびに(以下に投稿)
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ClassPool pool = ClassPool.getDefault();
CtClass superCc = null;
try {
superCc = pool.get(ResourceConfig.class.getCanonicalName());
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
CtClass cc = pool.makeClass("org.demonking.AppConfig");
cc.setSuperclass(superCc);
System.out.println(cc.getSuperclass().getName());
CtConstructor constructor = new CtConstructor(new CtClass[0], cc);
constructor.setBody("{\n"+"packages(\"org.demonking\");"+"\n"+"register(InjectorDemo.class);"+"\n"+"}");
cc.addConstructor(constructor);
} catch (CannotCompileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//rest of my jersey code
}
元のAppConfig(正常に動作します)動的に作成したい
public class AppConfig extends ResourceConfig{
public AppConfig()
{
packages("org.demonking");
register(new AbstractBinder(){
@Override
protected void configure() {
bindFactory(ContextHelperFactory.class)
.to(ContextHelper.class)
.in(RequestScoped.class);
}
});
}
調査中に、javassistには匿名の内部クラスに関していくつかの制限があるため、コードがInjectorDemoクラスにシフトされていることに気づきました。
public class InjectorDemo extends AbstractBinder {
@Override
protected void configure() {
// TODO Auto-generated method stub
bindFactory(ContextHelperFactory.class)
.to(ContextHelper.class)
.in(RequestScoped.class);
}
}
エラー
javassist.CannotCompileException: [source error] packages(java.lang.String) not found in org.demonking.AppConfig
at javassist.CtBehavior.setBody(CtBehavior.java:446)
at javassist.CtBehavior.setBody(CtBehavior.java:412)
at javassist.CtConstructor.setBody(CtConstructor.java:217)
at org.logicunit.JavassistDemoMain.main(JavassistDemoMain.java:42)
Caused by: compile error: packages(java.lang.String) not found in org.demonking.AppConfig
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:749)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:695)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:330)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
at javassist.compiler.Javac.compileBody(Javac.java:223)
at javassist.CtBehavior.setBody(CtBehavior.java:438)
私はそれを機能させました。同じ問題を抱えている人にとっての解決策は、適切なパラメータを使用してメソッドを適切に呼び出すことでした。私の場合、varargsを使用してメソッドを呼び出す方法を見つけたら、文字列を渡すときにvarargs引数を除いてpackagesメソッドを使用しました。 javassistを介した引数私はコードを機能させました。これが私のためにトリックをしたスレッドですhttps://issues.jboss.org/browse/JASSIST-192?_sscc=t
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加