다음과 같은 코드가 있습니다.Guice와 함께 생성자에서 검사 된 예외를 잘 처리하는 방법은 무엇입니까?
class A {
X x;
A() {
Class<? extends X> cls = ...;
Module module = ...;
Injector injector = Guice.createInjector(module);
x = injector.getInstance(cls);
}
}
콘크리트 유형 cls
은 런타임에만 결정되며이 생성자가 호출되기 전에는 알 수 없습니다.
지금 내 문제는 cls
의 생성자가 확인 된 예외를 던질 것으로 예상되며 가능한 경우 ProvisionException에서 래핑하지 않고 처리하려고합니다. Guice 문서에서는 throwing Provider Extension을 사용해야한다고 말합니다. 여기에는 복잡한 것 같습니다. 이보다 더 간단한 방법이 있습니까?
interface MyCheckedProvider<T> extends CheckedProvider<T> {
T get() throws MyCheckedException;
}
class XImplProvider implements MyCheckedProvider<X> {
@Inject dependency1;
@Inject dependency1;
X get() throws MyCheckedException {
return new XImpl(dependency1, dependency2);
}
}
class ProviderHolder {
@Inject MyCheckedProvider<X> provider;
}
class A {
X x;
A() {
Class<? extends MyCheckedProvider<X>> providerClass = ...;
Module module = new AbstractModule() {
void configure() {
...
ThrowingProviderBinder.create(binder())
.bind(MyCheckedProvider.class, X.class)
.to(providerClass.class);
}
};
Injector injector = Guice.createInjector(module);
ProviderHolder holder = injector.getInstance(ProviderHolder.class);
try {
x = holder.provider.get();
catch (MyCheckedException e) {
...
}
}
}
인터페이스 MyCheckedProvider
은 여러 장소에서 재사용 할 수 있기 때문에 괜찮을 것입니다.하지만 비슷한 것이 필요한 곳마다 별도의 ProviderHolder
클래스가 필요합니다. X를 구현하는 각 클래스에 대해 특정 공급자 구현이 필요합니다 (그 중 많은 수가있을 수 있음). 그래서 이것은 XFactory를 주입하고 각각의 구체적인 유형에 대해 XFactoryImpl을 작성하는 것보다 훨씬 더 효과적입니다 (피하려고했습니다).
나는
injector.getInstance(new TypeLiteral<MyCheckedProvider<X>>() {});
또는
injector.getCheckedProvider(cls, MyCheckedException.class);
와 같은 것을 할 수 있기를 바랬지만 이것이 지원되지 않는 것 같습니다.
물론 내가 왜 그런걸 보지 못했는지 모릅니다. 감사! 이제'XImplProvider'도 제거 할 수 있다면 좋을 것입니다. –