(AS7) Ошибка при вызове удаленного метода EJB с проксированным компонентом CDI в параметре

Могу ли я вызвать удаленный метод EJB с CDI bean в методе параметра?

Нравится:

У меня есть LoggedUserProducer.java, который создает пользователя из базы данных.

public class LoggedUserProducer {

    @Produces
    @SessionScoped
    @LoggedUser
    public User produceLoggedUser() throws Exception {
        ... //load user from database with a request token
        return user;
    }
}

И у меня есть JSF Bean, который делает вызов EJB:

CarController.java

@Named
@ViewScoped
public class CarController implements Serializable {

    @Inject //I have a producer to create the EJB proxy
    private RepairRemote repairRemote; //My remote EJB

    @Inject
    @LoggedUser
    private User loggedUser; //my User produced by LoggedUserProducer

    private Car car;

    public void repairCar() throws Exception {
        ... //some actions...

        Repair repair = new Repair(this.car)
        repair.setPerformedBy(loggedUser); //setting my proxified cdi bean into a POJO

        repairRemote.repair(repair); //here throws ClassNotFoundException;
    }

и Исключение:

java.lang.RuntimeException: ClassNotFoundException marshaling EJB parameters

at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:229)
at org.jboss.as.ejb3.remote.LocalEjbReceiver.clone(LocalEjbReceiver.java:216)
    ...
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
at org.jboss.weld.proxies.RepairRemote$-248248579$Proxy$_$$_WeldClientProxy.repair(RepairRemote$-248248579$Proxy$_$$_WeldClientProxy.java)
at com.mycompany.services.controller.CarController.repairCar(CarController.java:118)
at com.mycompany.services.controller.CarController$Proxy$_$$_WeldSubclass.repairCar(CarController$Proxy$_$$_WeldSubclass.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
...
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
at java.lang.Thread.run(Thread.java:662)

Caused by: java.lang.ClassNotFoundException: com.mycompany.portalcarweb.client.model.User$Proxy$_$$_WeldClientProxy from [Module "deployment.portalcarweb.war:main" from Service Module Loader]


Я не знаю, почему мой удаленный EJB не может найти класс com.mycompany.portalcarweb.client.model.User$Proxy$_$$_WeldClientProxy

Мой User.java развернут в модуле JBoss 7. Мой клиент и сервер EJB имеют папку jboss-deployment-structure.xml в папке WEB-INF и объявляют правильный модуль для доступа к этому классу.

Спасибо (извините за мой английский).


обновить

Два моих веб-приложения упакованы в файл WAR.


person ethanxyz_0    schedule 24.04.2013    source источник


Ответы (1)


Ваш JSF-бин не управляется CDI (@ViewScoped — это только JSF), если только вы не используете что-то вроде Seam 3, CODI или не написали свой собственный новый @ViewScoped.

Редактировать: На самом деле, это, вероятно, не ошибка. Вам придется передать копию, каждый раз, когда вы имеете дело с удаленными копиями EJB, это лучший способ.

person LightGuard    schedule 25.04.2013
comment
Я уже использую Seam 3. Но я не думаю, что эта ошибка связана с JSF или Seam. Потому что это только вызов EJB, отправляющий cdi bean (созданный cdi @Producer) - person ethanxyz_0; 26.04.2013
comment
Какую версию JBoss AS вы используете? - person LightGuard; 26.04.2013
comment
Это похоже на ошибку, попробуйте более новую версию и посмотрите, исправлена ​​ли она. - person LightGuard; 26.04.2013
comment
Я пробовал с 7.1.3 (создано из исходников) и EAP 6.1.0.Beta... и все равно получаю ошибку - person ethanxyz_0; 27.04.2013
comment
Я добавил Edit в ответ, вам нужно использовать копии объектов вместо фактического компонента CDI. - person LightGuard; 27.04.2013