Я пишу проект maven под названием «error project». Его цель - обрабатывать исключения в других проектах. Он использует другой «менеджер конфигурации» проекта maven. Конечная цель менеджера конфигурации - получить учетные данные базы данных из некоторых файлов xml. В этом проекте есть «IExceptionService», и другим проектам предлагается записывать свои исключения через этот интерфейс. Конкретный класс этого интерфейса назначается во время выполнения классом «DependencyResolver». Присваивание было выполнено в методе «resolve» как таковом:
@SuppressWarnings("unchecked")
public static <T> T resolve(Class<T> classType, HashMap<DependencyResolverParameter,String> parameterMap )
{
try {
if(classType == null)
throw new ArgumanBosHatasi("classType is null");
if(parameterMap == null)
throw new ArgumanBosHatasi(HashMap.class.toString());
assert classType != null : "classType == null";
if(classType.equals(IErrorRepository.class))
return (T)getIErrorRepository();
else if(classType.equals(IErrorFile.class))
return (T)getIErrorFile();
else if(classType.equals(ErrorBusinessRule.class))
return (T)getErrorBusinessRule();
else if(classType.equals(IErrorService.class))
{
try {
return (T)getIErrorService(parameterMap);
} catch (UygulamaHatasi applicationException) {
throw applicationException; }
}
else
throw new UnsupportedOperationException("Unknown class type.");
} catch (Exception exception) {
throw exception;
}
}
private static IErrorRepository getIErrorRepository() {
try
{
if(errorDatabase != null)
return errorDatabase;
KonfigurasyonYoneticisi yonetici = new KonfigurasyonYoneticisi();
String sifreKodu = "HATASIFRE";
String schema = yonetici.okuAyar("HATASCHEMA");
String tabloAdi = yonetici.okuAyar("HATATABLOSU");
String veritabaniUrl = yonetici.okuAyar("HATAVERITABANIURL"); //Here is line 92 in DependencyResolver
String kullaniciAdi = yonetici.okuAyar("HATAKULLANICIADI");
if(SozceIsleri.bosMu(sifreKodu))
throw new BasarisizIslemHatasi("sifreKodu boş geliyor.");
if(SozceIsleri.bosMu(schema))
throw new BasarisizIslemHatasi("schema boş geliyor.");
if(SozceIsleri.bosMu(tabloAdi))
throw new BasarisizIslemHatasi("tabloAdi boş geliyor.");
if(SozceIsleri.bosMu(veritabaniUrl))
throw new BasarisizIslemHatasi("veritabaniUrl boş geliyor.");
if(SozceIsleri.bosMu(kullaniciAdi))
throw new BasarisizIslemHatasi("kullaniciAdi boş geliyor.");
assert SozceIsleri.doluMu(sifreKodu) : "SozceIsleri.bosMu(sifreKodu)";
assert SozceIsleri.doluMu(schema) : "SozceIsleri.bosMu(schema)";
assert SozceIsleri.doluMu(tabloAdi) : "SozceIsleri.bosMu(tabloAdi)";
assert SozceIsleri.doluMu(veritabaniUrl) : "SozceIsleri.bosMu(veritabaniUrl)";
assert SozceIsleri.doluMu(kullaniciAdi) : "SozceIsleri.bosMu(kullaniciAdi)";
oracle.jdbc.OracleDriver oracleDriver = new oracle.jdbc.OracleDriver();
lock();
errorDatabase = new HataRepository(oracleDriver, veritabaniUrl,kullaniciAdi,sifreKodu,schema,tabloAdi);
openLock();
if(errorDatabase == null)
throw new BosIsaretciHatasi(MesajIsleri.<IErrorRepository>getirBosGeliyorMesaji(IErrorRepository.class));
return errorDatabase;
} catch (BosIsaretciHatasi | BasarisizIslemHatasi hata) {
throw hata;
}finally {
openLock();
}
}
«DependencyResolverParameter» является перечислением и имеет только значение «UYGULAMAANAHTAR». (КЛЮЧ ПРИЛОЖЕНИЯ)
Я вызываю этот метод так:
int applicationKey = 4;
HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();
map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
IExceptionService service = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);
Я определяю все необходимые зависимости внутри проекта. В приведенном выше коде переменная «service» не имеет значения null, как ожидалось, и она успешно записывает пробную ошибку всякий раз, когда я пишу ее внутри основного метода, как показано ниже:
public static void main(String[] args) {
int applicationKey = 4;
HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();
map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
IExceptionService servis = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);
System.out.println(String.format("is it null? %b", servis == null));
servis.report(new Exception("trial error. Do not care."));
}
Однако, когда я пишу код внутри JUnit4 test Я получаю «NullPointerException», как показано ниже:
@Test
public void getHataService_001() {
try
{
int applicationKey= 4;
HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();
map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
IExceptionService servis = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);
assertNotNull(servis);
} catch (Exception exception) {
fail(exception.getMessage());
}
}
Как я могу решить эту проблему? Заранее спасибо. Из трассировки стека я делаю вывод, что существует проблема чтения настроек из класса конфигурации.
зависимость junit:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
stacktrace:
m:java.lang.NullPointerExceptionlm:nullst:hata.businesslayer.dependencyresolvers.DependencyResolver.resolve(DependencyResolver.java:92)
kisi.core.crosscuttingconcern.exceptionhandling.HataIsleri.getHataService(HataIsleri.java:229)
kisi.core.crosscuttingconcern.exceptionhandling.HataIsleri.raporlaHata(HataIsleri.java:75)
test.hata.HataServisTesti.getHataService_001(HataServisTesti.java:62)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
2020/07/09 14:41:34
m:java.lang.NullPointerException
lm:nullst:hata.businesslayer.dependencyresolvers.DependencyResolver.resolve(DependencyResolver.java:92)
test.hata.HataServisTesti.getHataService_001(HataServisTesti.java:56)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)2020/07/09 14:41:34