6

こんにちは私は 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 の両方を使用した場合にのみ発生します

  1. ここで何が欠けていますか?このエラーを解決するには?

編集済み

2 つのカスタム メソッド パラメータ インジェクションを試しましたが、これも機能しません

@POST
@Path("/login")
@Timed
public void validateUser(@AuthParam AuthToken token, @TenantParam Tenant tenant) {


}
  1. ここで何が欠けていますか?これはジャージの制限ですか?
4

1 に答える 1