Я обновляю приложение с Java7 на Glassfish 3.1.2.2 до Java8 на Glassfish 4.1. Приложение упаковано в виде файла уха, содержащего jar-файл с удаленными EJB и Spring beans, а также военный файл с несколькими сервлетами и некоторыми веб-службами.Glassfish4 + EJB + Spring, deploy failed
Есть только некоторые незначительные изменения, сделанные в практическом применении, по сравнению с тем, как это было с Glassfish 3.x, общие изменения являются:
- Построенный с Java8 вместо Java7.
- Развернуты на Glassfish 4.1 вместо 3.1.2.2
- Новые версии Hibernate
- Следующая версия ActiveMQ (клиент)
Я не вижу никакой разницы между предыдущим перепонки файл, и новый (за исключением вышеуказанных Lib-банки), но до сих пор, когда я пытаюсь развернуть я получаю ошибки, как это для всех моих EJBs:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type SomethingLogic with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private com.my.application.server.service.SomethingServiceSession.somethingLogic
Где SomethingService является EJB, SomethingLogic является Spring боб.
Мои EJBs определяются следующим образом:
@Stateless
@RolesAllowed("secure")
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class SomethingServiceSession implements SomethingService {
@Inject
private SomethingLogic somethingLogic; //Spring bean
SomethingLogic является интерфейсом.
У меня есть beanRefContext.xml, содержащий:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg value="classpath*:applicationContext-glassfish.xml"/>
</bean>
</beans>
В EJB услуги определены в GlassFish-EJB-jar.xml, как это:
<ejb>
<ejb-name>SomethingServiceSession</ejb-name>
<ior-security-config>
<as-context>
<auth-method>USERNAME_PASSWORD</auth-method>
<realm>AD</realm>
<required>true</required>
</as-context>
</ior-security-config>
</ejb>
Я попытался добавления beans.xml со следующим содержимым в папку ресурсов \ META-INF моего EJB-проекта:
<?xml version="1.0"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd" />
Не повезло.
Я также попытался добавить @LocalBean ко всем моим EJB, также не повезло.
Кроме того, я попытался отключить КДИ все вместе, используя эту команду:
asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false
Это фактически позволяет мои EJB услуги, которые будут развернуты, но я подозревал, что она имеет не столь хорошие стороны эффект моих веб-сервисов не обнаруживается, поэтому я хочу иметь возможность развертывать с включенным CDI, чтобы это исключить.
Update:
Я попытался изменить @Inject с @Autowired во всех моих не-Спринг-обработанных классов (EJBs, веб-сервисы и сервлетов). Теперь я получаю ту же ошибку для реальных весенних бобах. Кажется, Glassfish попытается найти EJB beans при встрече с @Inject, независимо от того, где они происходят.
Сохранено множество неприятностей. Спасибо! – Thomas