Как внедрить EJB в Spring-WS @Endpoint

Мне нужно внедрить службу EJB в конечную точку Spring-WS:

@Stateless
public class MeteringPointService {

    private static final int LIMIT = 100;

    public Integer getResponseStatus() {
        return new Random().nextInt(LIMIT);
    }
}


@Endpoint
public class CreateMeteringPointEndpoint {

    private MeteringPointService meteringPointService;

    @PayloadRoot(localPart = "CreateMeteringPointRequest", namespace = "...")
    @ResponsePayload
    public CreateMeteringPointResponse handleRequest(@RequestPayload CreateMeteringPointRequest request) {

        CreateMeteringPointResponse response = new CreateMeteringPointResponse();
        Integer status = meteringPointService.getResponseStatus();
        response.setResponseStatus(status);
        return response;
    }

    public MeteringPointService getMeteringPointService() {
        return meteringPointService;
    }

    public void setMeteringPointService(MeteringPointService meteringPointService) {
        this.meteringPointService = meteringPointService;
    }
}

Я пробовал Spring

    <jee:local-slsb id="meteringPointService" jndi-name="ejb/meteringPointService"
                business-interface="service.impl.MeteringPointService"/>

    <bean id="createMeteringPointEndpoint" class="ws.endpoint.CreateMeteringPointEndpoint">
        <property name="meteringPointService" ref="meteringPointService"/>
    </bean>

Я попробовал @EJB(mappedName="") StackOverflow, Красная шляпа

А также попробовал CDI @Inject из Java EE6 StackOverflow

... но ничего не работает. Можешь мне помочь? Стеклянная рыбка 4.

Я все еще получаю ошибки во время развертывания, например:

remote failure: Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleExc
eption: org.apache.catalina.LifecycleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [service.impl.MeteringPointService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.facto
ry.annotation.Autowired(required=true)}. Please see server.log for more details.
Command deploy failed.

remote failure: Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleExc
eption: org.apache.catalina.LifecycleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [service.impl.MeteringPointService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}. Please
see server.log for more details.
Command deploy failed.

person sasynkamil    schedule 04.12.2013    source источник
comment
@Autowire и @Inject требуют, чтобы bean-компонент был доступен в контексте. Это явно не так. @Ejb должен быть в состоянии выполнить поиск, ЕСЛИ вы правильно укажете имя (также убедитесь, что в вашем файле web.xml есть запись для ссылки на EJB). Также что не удалось с поиском пространства имен (<jee:local-slsb />)? Это должно просто сработать...   -  person M. Deinum    schedule 05.12.2013
comment
@ M.Deinum Что вы подразумеваете под ссылкой на EJB в web.xml? Он не должен работать только с аннотацией [код](@EJB private MeteringPointService MeteringPointService;)?   -  person sasynkamil    schedule 05.12.2013
comment
Вам нужно определить свои ресурсы jndi в файле web.xml (чтобы сделать их доступными). Что вы пробовали при использовании @EJB? Вы использовали полное имя JNDI? Пространство имен по умолчанию выполняет поиск в java:comp/env, и это не очень известное место для EJB (если я не ошибаюсь).   -  person M. Deinum    schedule 05.12.2013
comment
@M.Denium Я только что использовал аннотацию без сохранения состояния для имени класса службы и аннотацию EJB для свойства, куда мне нужно его ввести. Я вообще не указывал имя JNDI, я думаю, что оно должно работать автоматически. По крайней мере, это работает, если я использую только EJB (не Spring)   -  person sasynkamil    schedule 05.12.2013
comment
Правильно, но Spring не является обычным CDI, и Spring будет вводить bean-компоненты только из контекста (или из того, что он может искать). Когда вы указываете EJB, он создает пару имен/записей JNDI для этого EJB (они указаны в спецификации EJB), которые вы можете/должны использовать для поиска. Но, как уже упоминалось, что вы пробовали (покажите какой-нибудь код, вы указали сопоставленное имя, но что/как/где).   -  person M. Deinum    schedule 05.12.2013
comment
@ M.Deinum Я использовал аннотацию EJB (mappedName = ejb/MeteringPointService)   -  person sasynkamil    schedule 05.12.2013
comment
Я использовал: jndi-name="java:global/psl-ws-mock2-trunk-SNAPSHOT/MeteringPointServiceImpl" и теперь это работает. Спасибо   -  person sasynkamil    schedule 05.12.2013
comment
Также должно быть более читаемое имя, если я не ошибаюсь. Что-то вроде java:module/MeteringPointServiceImpl!your.package.to.interface.MeteringPointService, если у вас нет интерфейса, замените его на FQCN. См. jaitechwriteups.blogspot.nl/2010/10. /   -  person M. Deinum    schedule 05.12.2013