WildFly 10: @ Stateful.name свойство игнорируется - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь установить EJB-контейнер на JBoss Wildfly на моей локальной машине, и мне, с некоторой помощью, удалось запустить и запустить контейнер с распознаванием компонентов Remote EJB.Однако я бы хотел, чтобы они назывались по-разному.

У меня есть свойство NAME во всех интерфейсах с желаемым именем реализующего компонента.Я поместил эту строку в @Stateless(name = Interface.NAME).

Однако бин все еще создается с именем реализующего класса.Что мне делать?

Редактировать: Мой 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

Заранее спасибо

1 Ответ

0 голосов
/ 23 октября 2018

Я не знаю, можете ли вы изменить имя самого класса, но в качестве примера вы можете использовать имя опубликованного 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

Класс такой:

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(название = "").Как мы говорили в чате, вы можете установить желаемое имя, используя строку.Еще больше вы можете искать, используя Переменная окружения и как Настроить его , но в вашем случае я не знаю, стоит ли оно того.

...