Не найден источник внедрения для параметра типа public com.phonepe.gandalf.models.authz.Permission - PullRequest
0 голосов
/ 17 февраля 2019

Я реализую пользовательскую аннотацию параметра, используя AbstractDataProvider.Я прошел по какой-то ссылке, но проблема остается.https://psamsotha.github.io/jersey/2015/11/01/jersey-method-parameter-injection.html

Внедрение параметров пользовательского метода в Джерси с помощью встроенного встраивания

Я получаю эту ошибку

No injection source found for a parameter of type public gandalf.models.authz.Permission

@Singleton
@Provider
public class RequestInfoProviders extends AbstractValueFactoryProvider {
    private static final Logger log = LoggerFactory.getLogger(RequestInfoProviders.class);

    @Inject
    public RequestInfoProviders(MultivaluedParameterExtractorProvider mpep, ServiceLocator locator) {
        super(mpep, locator, new Source[]{Source.UNKNOWN});
    }

    protected AbstractContainerRequestValueFactory<?> createValueFactory(Parameter parameter) {
        Class<?> classType = parameter.getRawType();
        if (classType != null && classType.equals(UserAuthContext.class)) {
            return new RequestInfoProviders.RequestInfoParamValueFactory();
        } else {
            log.warn("class {}", classType);
            log.warn("RequestContext annotation was not placed on correct object type; Injection might not work correctly!");
            return null;
        }
    }


    private static final class RequestInfoParamValueFactory extends AbstractContainerRequestValueFactory<UserAuthenticationContext> {

        @Context
        private ResourceContext requestContext;

        private RequestInfoParamValueFactory() {
        }

        public UserAuthenticationContext provide() {
            return UserAuthenticationContext.builder()
                    .build();
        }
    }

    @Singleton
    public static final class InjectionResolver extends ParamInjectionResolver<UserAuthContext> {
        public InjectionResolver() {
            super(RequestInfoProviders.class);
        }
    }
}

Таким образом, я зарегистрировал это

environment.jersey().register(new AbstractBinder() {
    protected void configure() {
        this.bind(RequestInfoProviders.class).to(ValueFactoryProvider.class).in(Singleton.class);
        this.bind(RequestInfoProviders.InjectionResolver.class).to(new TypeLiteral<InjectionResolver<UserAuthContext>>() {
        }).in(Singleton.class);
    }
});

Мой класс ресурсов

   @POST
    @Timed
    @ExceptionMetered
    @Authenticate
    @ApiOperation("Create a Permission")
    public Permission createPermission(@Valid PermissionRequest permissionRequest,
                                       @HeaderParam(AUTHORIZATION) String authorisation,
                                       @Context ContainerRequestContext context,
                                       @UserAuthContext UserAuthenticationContext authenticationContext) throws Exception {

        Permission permission = Permission.builder().permission(permissionRequest.getPermission())
                .active(permissionRequest.isActive())
                .createdBy(authenticationContext.getSession().getUserId())
                .namespace(authenticationContext.getSession().getNamespace())
                .build();

        return permissionService.create(permission);
    }

Класс аннотаций

@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, PARAMETER, METHOD, FIELD })
public @interface UserAuthContext {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...