こんにちは私は dropwizard を使用してアプリケーションを構築しています。つまり、Jersey 2.16 を REST API フレームワークとして内部的に使用しています。
すべてのリソースメソッドのアプリケーション全体について、いくつかの情報が必要なので、その情報を解析するために、以下のようなカスタムフィルターを定義しました
@java.lang.annotation.Target(ElementType.PARAMETER)
@java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
public @interface TenantParam {
}
テナント ファクトリを以下に定義します。
public class TenantFactory implements Factory<Tenant> {
private final HttpServletRequest request;
private final ApiConfiguration apiConfiguration;
@Inject
public TenantFactory(HttpServletRequest request, @Named(ApiConfiguration.NAMED_BINDING) ApiConfiguration apiConfiguration) {
this.request = request;
this.apiConfiguration = apiConfiguration;
}
@Override
public Tenant provide() {
return null;
}
@Override
public void dispose(Tenant tenant) {
}
}
私は実際にメソッドを実装していませんが、構造は上にあります。TenantparamResolver もあります
public class TenantParamResolver implements InjectionResolver<TenantParam> {
@Inject
@Named(InjectionResolver.SYSTEM_RESOLVER_NAME)
private InjectionResolver<Inject> systemInjectionResolver;
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> serviceHandle) {
if(Tenant.class == injectee.getRequiredType()) {
return systemInjectionResolver.resolve(injectee, serviceHandle);
}
return null;
}
@Override
public boolean isConstructorParameterIndicator() {
return false;
}
@Override
public boolean isMethodParameterIndicator() {
return true;
}
}
今私のリソースメソッドで私は以下のようにやっています
@POST
@Timed
public ApiResponse create(User user, @TenantParam Tenant tenant) {
System.out.println("resource method invoked. calling service method");
System.out.println("service class" + this.service.getClass().toString());
//DatabaseResult<User> result = this.service.insert(user, tenant);
//return ApiResponse.buildWithPayload(new Payload<User>().addObjects(result.getResults()));
return null;
}
これが私がアプリケーションを構成する方法です
@Override
public void run(Configuration configuration, Environment environment) throws Exception {
// bind auth and token param annotations
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(TenantFactory.class).to(Tenant.class);
bind(TenantParamResolver.class)
.to(new TypeLiteral<InjectionResolver<TenantParam>>() {})
.in(Singleton.class);
}
});
}
問題はアプリケーションの起動中にあり、エラーが発生しています
WARNING: No injection source found for a parameter of type public void com.proretention.commons.auth.resources.Users.create(com.proretention.commons.api.core.Tenant,com.proretention.commons.auth.model.User) at index 0.
非常に長いスタックエラースタックと説明があります
以下は、ユーザー pojo の宣言署名です。
public class User extends com.company.models.Model {
User クラスに注釈はありません。モデルは、long 型のプロパティ ID を 1 つだけ定義し、モデル クラスに注釈を定義しないクラスです。
上記の create resource メソッドから User パラメータを削除すると正常に動作し、TenantParam を削除すると正常に動作します。この問題は、User と TenantParam の両方を使用した場合にのみ発生します
- ここで何が欠けていますか?このエラーを解決するには?
編集済み
2 つのカスタム メソッド パラメータ インジェクションを試しましたが、これも機能しません
@POST
@Path("/login")
@Timed
public void validateUser(@AuthParam AuthToken token, @TenantParam Tenant tenant) {
}
- ここで何が欠けていますか?これはジャージの制限ですか?