Исключение нулевого указателя - внедрение зависимостей - Google Guice - PullRequest
0 голосов
/ 20 декабря 2018

Я получаю исключение NullPointerException при введении зависимости внутри перехватчика читателя Джерси, который я создал для перехвата определенного входящего запроса.

Вот код созданного мной ReaderInterceptor, в котором я пытаюсь ввести требуемую зависимость.

public class RegisterServiceInterceptor implements ReaderInterceptor {

    @Inject
    private CustomerBackendManager customerBackendManager;

    public static final Logger LOGGER = LoggerFactory.getLogger(RegisterServiceInterceptor.class);

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        InputStream is = context.getInputStream();
        String body = new BufferedReader(new InputStreamReader(is)).lines().collect(Collectors.joining("\n"));
        ObjectMapper mapper = new ObjectMapper();
        try {
            SampleObject sampleObject = mapper.readValue(body, SampleObject.class);
            customerBackendManager.createDatabase(sampleObject.getDatabaseName());
        } catch (JsonGenerationException | JsonMappingException e) {
            LOGGER.info(e.getMessage());
        }
        InputStream in = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
        context.setInputStream(in);
        return context.proceed();
    }

}

Я получаю NPE в строке customerBackendManager.createDatabase(...);.Зависимость не была введена в этот класс.

Я определил конфигурацию для этой зависимости как

public class ExampleAddonMicroserviceModule extends AbstractModule
        implements ConfigurationAwareModule<ExampleAddonMicroserviceConfiguration> {

    @Provides
    @Singleton
    public CustomerBackendManager customerBackendManager(DBI dbi, Injector injector) {
        CustomerBackendManager manager = dbi.onDemand(CustomerBackendManagerImpl.class);
        injector.injectMembers(manager);
        return manager;
    }

    @Provides
    @Singleton
    public RegisterServiceInterceptor registerServiceInterceptor(DBI dbi, Injector injector) {
        RegisterServiceInterceptor manager = dbi.onDemand(RegisterServiceInterceptor.class);
        injector.injectMembers(manager);
        return manager;
    }
}

Какую дополнительную конфигурацию мне нужно добавить, чтобы иметь возможность добавить эту зависимость в этот класс?

1 Ответ

0 голосов
/ 21 декабря 2018

Я разобрался с решением этой проблемы.

Проблема заключалась в том, что Джерси ожидает класса перехватчика в конфигурации, который он должен вызывать при выполнении критериев перехвата, и это приводило к тому, что класс RegisterServiceInterceptor был инициализирован дважды.Следовательно, NPE в классе RegisterServiceInterceptor.

Я определил эту конфигурацию в отдельном файле конфигурации как

@Provider
public class ResourceFilteringConfiguration implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        if (RegistrationService.class.equals(resourceInfo.getResourceClass())
                && resourceInfo.getResourceMethod().getName().equals("register")) {
            context.register(RegisterServiceInterceptor.class);
        }
    }

}

В строке context.register(RegisterServiceInterceptor.class); я передавал сам класс RegisterServiceInterceptor, которыйвызывал его инициализацию до того, как была достигнута конфигурация зависимостей (упомянутая в вопросе).Таким образом, этот перехватчик инициализировался дважды, что вызывало эту проблему.Я изменил код файла конфигурации на

@Provider
public class ResourceFilteringConfiguration implements DynamicFeature {

    @Inject
    private RegisterServiceInterceptor registerServiceInterceptor;

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        if (RegistrationService.class.equals(resourceInfo.getResourceClass())
                && resourceInfo.getResourceMethod().getName().equals("register")) {
            context.register(registerServiceInterceptor);
        }
    }

}

Как вы, наверное, заметили, я сделал изменение, заключающееся в передаче объекта RegisterServiceInterceptor в конфигурацию, и он начал работать нормально.

...