У нас есть проблема, связанная с загрузчиками классов и orika, после переноса нашего весеннего загрузочного приложения со встроенного причала на встроенный tomcat. Вот два класса:
@Getter
@Builder
public class SettingsModel {
public final Boolean useSelfSignUp;
public final Boolean approve;
public final Boolean verifyData;
public final Boolean collectMid;
public final Boolean flowEnabled;
public final String partnerName;
public final String networkType;
public final String upc;
}
и
@Getter
@Setter
public class SettingsDto {
private Boolean useSelfSignUp;
private Boolean approve;
private Boolean verifyData;
private Boolean collectMid;
private String partnerName;
private String networkType;
private Boolean flowEnabled;
private String upc;
}
и код сопоставления:
private final MapperFacade mapper;
...
mapper.map(settingsDto, SettingsModel.class)
После перехода к встроенному отображению tomcat возникает исключение
Caused by: java.lang.IllegalAccessError: tried to access method
onboarding.data.models.SettingsModel.<init>(Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V from class onboarding.data.models.SettingsModel_SettingsDto_ObjectFactory1006013014242721698432955$9
Я обнаружил, что orika использует JavassistCompilerStrategy со следующим кодом
Class<?> compiledClass = byteCodeClass.toClass(Thread.currentThread().getContextClassLoader(), this.getClass().getProtectionDomain());
Когда мы использовали встроенный причал Thread.currentThread().getContextClassLoader() - возвращает sun.misc.Launcher$AppClassLoader, и все работает, как и ожидалось, но после перехода на встроенный tomcat он возвращает TomcatEmbeddedWebappClassLoader, и сопоставление вызывает исключение.
Похоже, что работают два загрузчика классов sun.misc.Launcher$AppClassLoader и TomcatEmbeddedWebappClassLoader, и этот загрузчик классов tomcat не может найти все конструкторы аргументов с модификатором доступа по умолчанию (сгенерированным lombok) в SettingsModel.
упаковка jar используется для приложения.
Я не уверен, связана ли эта проблема с Orika или spring boot.
Также я нашел аналогичную проблему https://gitter.im/spring-projects/spring-boot/archives/2016/01/15, но не уверен, что это та же проблема или что-то еще, и я не могу применить исправление, предоставленное там, потому что эти классы недоступны в весенней загрузке 2.0.3.RELEASE версия.
Я пытался использовать EclipseJdtCompilerStrategy вместо JavassistCompilerStrategy для Orika, это не помогло.
весенняя загрузочная версия - 2.0.3.RELEASE
версия орики - 1.5.2