В настоящее время я обновляю одно приложение с Spring Boot 1.X до 2.X. Одним из тестов в приложении является тестирование удаленного EJB без сохранения состояния с использованием OpenEJB под @SpringBootTest. Так как поддержка SpringBeanAutowiringInterceptor была прекращена в Spring 5, я столкнулся с задачей переписать логику и протестировать ее, и здесь возникает проблема:
Мы работаем на JDK 1.8 и openejb (4.7.4, который используется в тесте для инициализации jndiContext), не может обрабатывать многократные JAR-файлы, которые зависят от обновления до Spring Boot 2.X (для пример байт-приятеля и др.) OpenEJB пытается загрузить META-INF / version / 9 / module-info и завершается с ошибкой IllegalArgumentException.
Я также пытаюсь переключиться с OpenEJB на EJBcontainer вместе с glassfish в качестве загрузчика, но я сталкиваюсь с другими проблемами (bean-компонент без сохранения состояния не установлен в jndContext - проверено в DEBUG), который я сейчас пытаюсь решить.
У меня такой вопрос: Есть ли какая-либо возможность заставить classloader или openejb игнорировать module-info, чтобы иметь возможность запускать его под JDK 1.8 с несколькими выпусками jar на classpath? Или есть способ использовать EJBContainer с glassfish-embedded-all, который в настоящее время не загружает EJB, но, по крайней мере, загружает контекст без ошибок? Мне нужно избежать ошибки или использовать другой способ тестирования объекта без состояния в SpringBootTest.
Примечание: я не хочу использовать Arquillian
Сводка версий:
- JDK 1,8
- spring-boot-starter-parent: 2.1.3.RELEASE
- openejb-core: 4.7.4
- Glassfish-Embedded-All: 5.1.0
Ошибка при использовании openEJB (информация о модуле, проблема с несколькими выпусками JAR):
ERROR OpenEJB [] []- FATAL ERROR: Unknown error in Assembler. Please send the following stack trace and this message to users@tomee.apache.org :
java.lang.IllegalArgumentException
at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
at org.apache.openejb.util.AnnotationFinder.readClassDef(AnnotationFinder.java:299)
at org.apache.openejb.util.AnnotationFinder.find(AnnotationFinder.java:164)
at org.apache.openejb.config.DeploymentLoader.checkAnnotations(DeploymentLoader.java:2008)
at org.apache.openejb.config.DeploymentLoader.discoverModuleType(DeploymentLoader.java:1891)
at org.apache.openejb.config.DeploymentsResolver.processUrls(DeploymentsResolver.java:389)
at org.apache.openejb.config.DeploymentsResolver.loadFromClasspath(DeploymentsResolver.java:302)
at org.apache.openejb.config.ConfigurationFactory.getModulesFromClassPath(ConfigurationFactory.java:664)
Ошибка при использовании Glassfish (возможно, указаны неправильные МОДУЛИ?):
ERROR embedded [] []- EJB6005:No EJB modules found
Важная часть класса испытаний:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
CommonTestConfiguration.class,
DatabaseTestConfiguration.class,
PropositionServiceConfiguration.class,
BeanUtils.class,
PropositionRemoteServiceImpl.class,
PropositionRemoteService.class})
@DirtiesContext
public class PropositionRemoteServiceImplTest {
@Autowired
private AdminFacade adminFacade;
private PropositionRemoteService remoteService;
@Before
public void setUp() throws NamingException {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
//props.put("openejb.deployments.classpath.exclude", ".*?module-info.*?");
Context jndiContext = new InitialContext(props);
remoteService = (PropositionRemoteService) jndiContext.lookup("PropositionRemoteServiceImplRemote");
// Map<String, Object> properties = new HashMap<>();
// properties.put(EJBContainer.MODULES, new File("target/classes"));
// EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
// Context ctx = ejbContainer.getContext();
// remoteService = (PropositionRemoteService) ctx.lookup("PropositionRemoteServiceImplRemote");
}
Структура проекта (упрощенно - крупный проект, изменить нельзя):
ude> root node module - pom
adapter> - node-module
ejb-adapter> node module
ejb-adapter-impl> node module containing Stateless bean used in test
test> node module
test-unit> node module where the Test class is defined and run
UPDATE:
В настоящее время пытается использовать apache-tomee (1.7.5) вместо openejb-core sbut, но также используется asm5, и возникает такая же ошибка