2015-06-16 4 views
1

Я пытаюсь использовать Dozer в Android-проекте. Но когда я пытаюсь отобразить Bean в другой Bean, он выдает следующее сообщение об ошибке:Android + Dozer выбрасывает IllegalArgumentException

06-16 09:45:56.687 1727-1727/ch.heia_fr.tic.ipal.test_dozer E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: ch.heia_fr.tic.ipal.test_dozer, PID: 1727 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ch.heia_fr.tic.ipal.test_dozer/ch.heia_fr.tic.ipal.test_dozer.MainActivity}: java.lang.IllegalArgumentException: http://apache.org/xml/features/validation/schema 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2760) 
      at android.app.ActivityThread.access$900(ActivityThread.java:177) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:145) 
      at android.app.ActivityThread.main(ActivityThread.java:5944) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 
    Caused by: java.lang.IllegalArgumentException: http://apache.org/xml/features/validation/schema 
      at org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:86) 
      at org.dozer.loader.xml.XMLParserFactory.createDocumentBuilderFactory(XMLParserFactory.java:56) 
      at org.dozer.loader.xml.XMLParserFactory.createParser(XMLParserFactory.java:35) 
      at org.dozer.loader.xml.MappingStreamReader.<init>(MappingStreamReader.java:43) 
      at org.dozer.loader.xml.MappingFileReader.<init>(MappingFileReader.java:44) 
      at org.dozer.DozerBeanMapper.loadFromFiles(DozerBeanMapper.java:219) 
      at org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:209) 
      at org.dozer.DozerBeanMapper.initMappings(DozerBeanMapper.java:315) 
      at org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:192) 
      at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120) 
      at ch.heia_fr.tic.ipal.test_dozer.MainActivity.onCreate(MainActivity.java:26) 
      at android.app.Activity.performCreate(Activity.java:6289) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2760) 
            at android.app.ActivityThread.access$900(ActivityThread.java:177) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:145) 
            at android.app.ActivityThread.main(ActivityThread.java:5944) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 

Вот моя build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "ch.heia_fr.tic.ipal.test_dozer" 
     minSdkVersion 19 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    packagingOptions{ 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.2.0' 
    compile 'net.sf.dozer:dozer:5.4.0' 
} 

И код, который создает проблемы:

PersonBean bean = new PersonBean(); 
bean.setFirstName("Bob"); 
bean.setLastName("Robert"); 
bean.setStreet("Main Street"); 
bean.setTown("Bern"); 

Mapper mapper = new DozerBeanMapper(); 
PersonDTO dto = mapper.map(bean, PersonDTO.class 

Я думаю, проблема связана с отсутствующим XML MappingFile, но я не знаю, где разместить его в проекте Android.

Thanks

+0

Не похоже, что они планируют добавить поддержку Android: https://github.com/DozerMapper/dozer/issues/252 – LordParsley

ответ

2

Он даже не начинает поиск файла сопоставления. Если вы посмотрите на DocumentBuilderFactory, реализованный в android-sdk-22, вы увидите, что этот метод не реализован. Фактически это исключает.

Я предполагаю, что определение отображения бина XML не поддерживается в android. Попробуйте сопоставить API, как показано в документации.

EDIT: Он также не работает. Dozer по-прежнему пытается загрузить оба сопоставления (сопоставления компоновщика и сопоставления на основе файлов) при вызове карты. До тех пор, я пробовал Dozer, Orika и ModelMapper, но только последний работает в android.

Смежные вопросы