WildFly 10:@Stateful.name 属性 被忽略

WildFly 10: @Stateful.name property is ignored

我正在尝试在我本地机器上的 JBoss Wildfly 上安装一个 EJB 容器,在一些帮助下,我设法启动了容器并 运行,使用 Remote EJB bean 已识别。但是,我希望它们以不同的方式命名。

我在所有接口中都有一个 NAME 属性,其中包含实现 bean 的所需名称。我把那个字符串放在 @Stateless(name = Interface.NAME).

但是,bean 仍然使用实现 class 名称创建。 我该怎么办?

编辑:我的 EJB 实现:

@Stateful(mappedName = StateService.NAME)
public class StateServiceImpl implements StateService {

private final Map<SessionId, Deque<State>> sessions;
private final List<StateChangeListener> listeners;

public StateServiceImpl() {
    this.sessions = new HashMap<>();
    this.listeners = new ArrayList<>();
}

@Override
public State getCurrentState(SessionId sessionId) {
    return sessions.get(sessionId).peek();
}

@Override
public State popCurrentState(SessionId sessionId) {
    State previousState = sessions.get(sessionId).pop();
    State currentState = sessions.get(sessionId).peek();

    StateChangeEvent event = new StateChangeEvent(previousState, currentState);
    fireStateChangeEvent(event);

    return currentState;
}

@Override
public Deque<State> getStateHistory(SessionId sessionId) {
    return new LinkedList<>(sessions.get(sessionId));
}

@Override
public void updateState(SessionId sessionId, State state) {
    State previousState = sessions.get(sessionId).peek();

    if (!sessions.containsKey(sessionId)) {
        sessions.put(sessionId, new LinkedList<>());
    }

    sessions.get(sessionId).push(state);

    StateChangeEvent event = new StateChangeEvent(previousState, state);
    fireStateChangeEvent(event);
}

@Override
public void addStateChangeListener(StateChangeListener listener) {
    listeners.add(listener);
}

@Override
public void removeStateChangeListener(StateChangeListener listener) {
    listeners.remove(listener);
}

protected void fireStateChangeEvent(StateChangeEvent event) {
    listeners.forEach(listener -> listener.stateChanged(event));
}
}

我的界面:

/**
 * Service interface to manage state changes on the server-side
 */
@Remote
public interface StateService {

    String NAME = "StateService";

    /**
     * returns the most recent state stored for the given session id
     */
    State getCurrentState(SessionId sessionId);

    /**
     * removes the last entry of session from the queue, returning the one before
     */
    State popCurrentState(SessionId sessionId);

    /**
     * returns the whole history of a given client
     */
    Deque<State> getStateHistory(SessionId sessionId);

    /**
     * adds a new session to the stack
     *
     * @param sessionId the client the state is updated for
     * @param state     the updated state
     */
    void updateState(SessionId sessionId, State state);

    void addStateChangeListener(StateChangeListener listener);

    void removeStateChangeListener(StateChangeListener listener);

    interface StateChangeListener {
        void stateChanged(StateChangeEvent event);
    }

    @AllArgsConstructor
    @Getter
    class StateChangeEvent {
        private final State previousState;
        private final State nextState;
    }
}

这些是绑定:

[INFO] [talledLocalContainer]   java:global/web-be/web-impl-0.0.1-SNAPSHOT/MenuServiceImpl!io.ropi.fiveshelly.services.MenuService
[INFO] [talledLocalContainer]   java:app/web-impl-0.0.1-SNAPSHOT/MenuServiceImpl!io.ropi.fiveshelly.services.MenuService
[INFO] [talledLocalContainer]   java:module/MenuServiceImpl!io.ropi.fiveshelly.services.MenuService
[INFO] [talledLocalContainer]   java:global/web-be/web-impl-0.0.1-SNAPSHOT/MenuServiceImpl
[INFO] [talledLocalContainer]   java:app/web-impl-0.0.1-SNAPSHOT/MenuServiceImpl
[INFO] [talledLocalContainer]   java:module/MenuServiceImpl

提前致谢

我不知道您是否可以更改 class 本身的名称,但是作为示例,您可以使用已发布的 JNDI 的名称(取决于我的项目名称):

java:global/Depends/NameDesired!MyClassName
java:app/Depends/NameDesired!MyClassName
java:module/NameDesired!MyClassName
java:global/Depends/NameDesired
java:app/Depends/NameDesired
java:module/NameDesired

class是这样的:

import javax.ejb.Stateless;

@Stateless(name="NameDesired")
public class MyClassName { 
    public void doThing() {
        System.out.println("Doing some work...");
    }
} 

那么你可以像这样使用:

//I'm using here the fourth line of the JNDI, just using the name I want:
MyClassName example = (MyClassName) (new InitialContext().lookup("java:global/Depends/NameDesired"));

甚至

@EJB(beanName="NameDesired")
private MyClassName example;

请注意,您已经使用了正确的注解@Stateless(name="")。正如我们在聊天中所说,您可以使用字符串设置所需的名称。您甚至可以使用 Environment Variable and how to Configure it 进行查找,但在您的情况下,我不知道是否值得。