powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / мультимодульный проект на Maven (сервис ejb + spring)
5 сообщений из 5, страница 1 из 1
мультимодульный проект на Maven (сервис ejb + spring)
    #37901978
Mindzor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть:
0) мультимодульный проект на Maven.

1) ejb модуль разработанный не мной и вполне работающий в котором есть класс помеченный аннотациями @Stateless и @Remote. В общем этот класс для реализации сервиса.

2) другой тоже вполне работающий spring модуль который использует сервис из ejb модуля.


Что я сделал:
0) добавил в сервис пару новых методов. сделал 100% все по аналогии с уже имеющимися методами.

1) также добавил использование этих методов в spring модуль.


Проблема:
0) раньше было так. один раз деплоится ejb модуль с сервисом. далее работа идет со spring модулем т.е. если я что-то изменил то деплою только spring-модуль потому что ejb модуль с сервисом уже развернут.

1) сейчас стало так: если я что-то изменяю в spring модуле то после деплоймента spring модуля получаю ошибку что он невидит в сервисе моих НОВЫХ (подчеркиваю, потому что старые добавленные не мной он видит) методов хотя они там есть. решается этой сборкой всего проекта т.е. ejb + spring и развертывать надо тоже все разом. меня это не устраивает потому что модули стали зависить друг от друга по билду и время разработки возрастает.

что это за фигня такая?
...
Рейтинг: 0 / 0
мультимодульный проект на Maven (сервис ejb + spring)
    #37901994
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mindzor,

обновленные интерфейсы не забыли в спринговый модуль положить?
...
Рейтинг: 0 / 0
мультимодульный проект на Maven (сервис ejb + spring)
    #37902014
Mindzor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТимоН,

в конфиге спринг модуля
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
    <jee:jndi-lookup id="userService" jndi-name="kmg-ear-1.0/ejb/User/remote"
                     proxy-interface="com.ejb.facade.IUserService" lookup-on-startup="false">
        <jee:environment>
            java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
            java.naming.provider.url=jnp://localhost:1099
            java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
        </jee:environment>
    </jee:jndi-lookup>



com.ejb.facade.IUserService находится в ejb модуле с сервисом

а в коде спринг модуля делается автоинъект
Код: java
1.
2.
3.
    @Autowired
    @Qualifier("userService")
    protected IUserServiceuserService;
...
Рейтинг: 0 / 0
мультимодульный проект на Maven (сервис ejb + spring)
    #37902041
Mindzor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и потом обновленные интерфейсы уже должны быть в этом модуле потому что как я писал выше

1) добавил в сервис методов, скомпилил его, и развернул. все больше я его не трогаю.
2) проблема в том что при изменении кода в спринг модуле приходится опять таки заново компилить и деплоить сервис. а зачем если я его не менял?
...
Рейтинг: 0 / 0
мультимодульный проект на Maven (сервис ejb + spring)
    #37902503
Mindzor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потратил время и написал расширенную версию вопроса.

Суть проблемы
Необходимо в мультимодульном Maven проекте добавить несколько методов к сервису и потом использовать эти методы вызывая их из контроллера MVC.

Сначала приведу небольшой обзор проекта, т.к. потом легче объяснить в чем проблема.
Maven-проект состоящий из следующих основных модулей:
map-tool // mvc

app-ear // типа как пакет для app-ejb

app-ejb // сервис

app-model // orm модель

...


Вот интерфейс сервиса:
[app-ejb\src\main\java\com\rootdata\app\ejb\facade\portlet\userbase\IAppUserBaseService.java]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package com.rootdata.app.ejb.facade.portlet.userbase;
import java.util.List;
import com.rootdata.app.ejb.facade.IAppEao;
import com.rootdata.app.model.dto.*;
public interface IAppUserBaseService extends IAppEao {
    public static final String JNDIName = "ejb/AppUserBase";
    // ...
    List<User> getUsers() throws Exception; // метод который уже изначально был
    User getUserByKey(String key) throws Exception; // метод который нужно мне добавить, что я и делаю
}



Далее переходим к реализации этого интерфейса:
[app-ejb\src\main\java\com\rootdata\app\ejb\db\portlet\userbase\AppUserBaseBean.java]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
package com.rootdata.app.ejb.db.portlet.userbase;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.LinkedList;
import java.util.List;

import com.rootdata.app.ejb.facade.*;
import com.rootdata.app.ejb.facade.portlet.userbase.IAppUserBaseService ;
import com.rootdata.app.model.dto.*;
import com.rootdata.app.model.entity.*;
import com.rootdata.app.model.util.EntityToDTOUtil;

@Stateless(name = IAppUserBaseService .JNDIName)
@Remote(IAppUserBaseService .class)
public class AppUserBaseBean implements IAppUserBaseService {
    ...
    @EJB
    IUserEao userEao;
    ...
    @PersistenceContext(unitName = PERSISTENT_CTX_UNIT_NAME)
    private EntityManager em;
    ...
    @Override
    public List<User> getUsers() throws Exception { // изначально было
        List<com.rootdata.app.model.entity.User> userEntities = userEao.getUsers();
        return (List<User>) EntityToDTOUtil.copyBeanListProperties(User.class, new LinkedList<User>(), userEntities);
    }
    @Override
    public Branch getUserByKey(String key) throws Exception { // метод, который я добавил для своей задачи
        com.rootdata.app.model.entity.User user = userEao.findByKey(key);
        return (User) EntityToDTOUtil.copyProperties(new User(), user);
    }
}



В реализации используется EAO, ниже показан интерфейс и реализация:
[app-ejb\src\main\java\com\rootdata\app\ejb\facade\IUserEao.java]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
package com.rootdata.app.ejb.facade;

import java.util.List;

import com.rootdata.app.model.entity.User;

public interface IUserEao extends IAppEao {
    public static final String JNDIName = "ejb/AppUser";
    ...
    List<User> getUsers(); // было
    User findByKey(String key) throws Exception; // я добавил
}



[app-ejb\src\main\java\com\rootdata\app\ejb\db\UserEao.java]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
package com.rootdata.app.ejb.db;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.LinkedList;
import java.util.List;

import com.rootdata.app.ejb.facade.IUserEao;
import com.rootdata.app.model.entity.User;
import com.rootdata.app.model.util.EntityToDTOUtil;

@Stateless(name = IUserEao.JNDIName)
@Remote(IUserEao.class)
public class UserEao implements IUserEao {
    @PersistenceContext(unitName = PERSISTENT_CTX_UNIT_NAME)
    private EntityManager em;
    @Override
    public List<User> getUsers() { // было
        javax.persistence.Query query = em.createQuery("from User u where u.blocked = false ");
        return query.getResultList();
    }
    ...    
    @Override
    public User findByKey(String key) throws Exception { // я добавил
        javax.persistence.Query query = em.createQuery("from User u where u.key = :key ").setParameter("key", key);
        return (User) query.getSingleResult();
    }
}



Теперь контроллер. Он находится в другом модуле.
[map-tool\src\main\java\com\rootdata\app\portlet\map-tool\spring\controller\UserController.java]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
package com.rootdata.app.portlet.map_tool.spring.controller;

import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;
import java.util.List;
import java.util.ResourceBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.portlet.bind.annotation.ResourceMapping;

import com.rootdata.app.ejb.facade.portlet.userbase.IAppUserBaseService;
import com.rootdata.app.model.dto.User;

@RequestMapping(value = "VIEW")
@Controller(value = "mapToolController")
public class UserController {
    @ResourceMapping("USER")
    public String list(@RequestParam(value = "mapToolStatus", required = false) String mapToolStatus, Model model, PortletRequest request) throws Exception {
                ...
                usersAll = dictionaryService.getUsers(); // этот метод работает всегда
                userSingle = dictionaryService.getBranchByKey(key); // это метод который добавил я. есть условия при которых он не работает. подробнее далее...
                ...
        return "user/list";
    }
}



Также в этом модуле находится конфиг Spring.
[map-tool\src\main\webapp\WEB-INF\app_map-tool-portlet.xml]
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
    <context:component-scan base-package="com.rootdata.app.portlet.map_tool.spring.controller"/>
    ...
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
    ...
    <jee:jndi-lookup id="dictionaryService" jndi-name="app-ear-1.0/ejb/AppUserBase/remote"
                     proxy-interface="com.rootdata.app.ejb.facade.portlet.userbase.IAppUserBaseService" lookup-on-startup="false">
        <jee:environment>
            java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
            java.naming.provider.url=jnp://localhost:1099
            java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
        </jee:environment>
    </jee:jndi-lookup>
</beans>



Теперь в чем проблема. Разработку я веду в IntelliJ IDEA 11.
Как вы видели я просто добавил еще один метод для своей задачи и прописал его использование в другом модуле.
1) Если делать compile и package в целом для всего проекта, то на выходе получаем app-ear.ear и map-tool.ear и др. пакеты, которые успешно деплоятся и работают.
app-ear.ear
map-tool.ear

2) Однако, дальше если я внесу изменения в map-tool и сделаю его компиляцию, package и деплоймент
app-ear.ear // оставляю прежний потому что ничего в нем не менял
map-tool.ear // заменяю на новый измененный

то при работе с ним буду получать ошибку на всех вызовах своего (подчерквиваю т.к. другие методы которые изначально были работают) добавленного метода:
Код: java
1.
2.
usersAll = dictionaryService.getUsers(); // здесь не будет ошибки
userSingle = dictionaryService.getBranchByKey(key); // это метод который добавил я. здесь будет ошибка!!!



САМА ОШИБКА:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
15:13:22,400 ERROR [DispatcherPortlet] Could not complete request
javax.portlet.PortletException: Error occured during request processing: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at org.springframework.web.portlet.DispatcherPortlet.doResourceService(DispatcherPortlet.java:872)
   ...
   at java.lang.Thread.comn(Thread.java:662)
Caused by: java.lang.NoSuchMethodError: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at com.rootdata.app.portlet.map_tool.spring.controller.UserController.list(UserController.java:41)
   ... 197 more
15:13:22,930 ERROR [DispatcherPortlet] Could not complete request
javax.portlet.PortletException: Error occured during request processing: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at org.springframework.web.portlet.DispatcherPortlet.doResourceService(DispatcherPortlet.java:872)
   ...
   at java.lang.Thread.comn(Thread.java:662)
Caused by: java.lang.NoSuchMethodError: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at com.rootdata.app.portlet.map_tool.spring.controller.UserController.list(UserController.java:41)
   ... 197 more
15:13:23,607 ERROR [org_springframework_web_portlet_DispatcherPortlet] The portlet threw an exception
javax.portlet.PortletException: Error occured during request processing: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at org.springframework.web.portlet.DispatcherPortlet.doResourceService(DispatcherPortlet.java:872)
   ...
   at java.lang.Thread.comn(Thread.java:662)
Caused by: java.lang.NoSuchMethodError: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at com.rootdata.app.portlet.map_tool.spring.controller.UserController.list(UserController.java:41)
   ... 197 more
15:13:24,313 ERROR [DefaultPortalControlPolicy] Rendering portlet window  produced an error
javax.portlet.PortletException: Error occured during request processing: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at org.springframework.web.portlet.DispatcherPortlet.doResourceService(DispatcherPortlet.java:872)
   ...
   at java.lang.Thread.comn(Thread.java:662)
Caused by: java.lang.NoSuchMethodError: com.rootdata.app.ejb.facade.portlet.dictionary.IAppUserBaseService .getBranchByKey(Ljava/lang/String;)Lcom/rootdata/app/model/dto/User;
   at com.rootdata.app.portlet.map_tool.spring.controller.UserController.list(UserController.java:41)
   ... 197 more



Почему вызов моего метода в этой ситуации дает ошибку?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / мультимодульный проект на Maven (сервис ejb + spring)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]