Java 无法将Spring服务注入akka服务

Java 无法将Spring服务注入akka服务,java,spring,jsf,akka,akka-persistence,Java,Spring,Jsf,Akka,Akka Persistence,我有Spring服务,实际上是actor,它收到了信息,但我不能将它传递给另一个Spring服务,因为注入失败 @Service("mailContainer") @Scope("prototype") @Component public class MailContainer extends UntypedActor { private final LoggingAdapter LOG = Logging.getLogger(getContext().system(), this);

我有Spring服务,实际上是actor,它收到了信息,但我不能将它传递给另一个Spring服务,因为注入失败

@Service("mailContainer")
@Scope("prototype")
@Component
public class MailContainer extends UntypedActor {

    private final LoggingAdapter LOG = Logging.getLogger(getContext().system(), this);

    private Mail value;
    private List<Mail> mailList = new ArrayList<Mail>();
    private Integer size;

    @Autowired
    @Qualifier("springService")
    private SpringService springService;

    //@Autowired
    public void setSpringService(SpringService springService) {
        this.springService = springService;
    }

    public MailContainer(Mail value) {
        this.value = value;
    }

    @Override
    public void onReceive(Object message) throws Exception {

        //    LOG.debug("+ MailContainer message: {} ", message);
        if (message instanceof Mail) {
            value = (Mail) message;
            System.out.println("MailContainer get message with id   " + value.getId());
            System.out.println("With time   " + value.getDateSend());
            //getSender().tell(value, getSelf()); //heta uxarkum
            //this.saveIt(value);
            springService.add(value);
        }

    }

因此,我如何注入另一个Spring服务????

基于我们的讨论,我认为这是由于您创建MailContainer actor的方式。您没有使用SpringExtProvider,而是直接使用Props.create。这意味着Spring没有机会对您的新参与者执行依赖注入

尝试更改此代码:

@Override
public void preStart() throws Exception {
    System.out.println("Mail collector preStart: {} ");
    getContext().actorOf(Props.create(MailContainer.class, result), "one");
}
要像这样使用SpringExtProvider,请执行以下操作:

@Override
public void preStart() throws Exception {
    System.out.println("Mail collector preStart: {} ");
    getContext().actorOf(SpringExtProvider.get(getContext().system()).props("mailContainer"), "one");
}

这样,您就要求Spring扩展创建新的actor并注入任何必需的依赖项。

您是如何创建MailContainer actor的?请显示执行actorOf()方法的代码。您需要通过扩展创建MailContainer,以确保依赖项注入按要求执行。在需要创建actor时,我希望类似于
getContext().actorOf(SpringExtProvider.get(actorSystem.props)(“MailContainer”)
。Spring不会自动为您创建actor Actors创建了成功的Spring或不使用Spring,问题是当我想只注入Spring服务时,它不是基于actor的,它是失败的,例如,我想从上一个actor将数据传递到Spring服务并保存到db。在tomcat下,Autowire inject不工作创建MailContainer actor的方式对于依赖项注入的工作非常重要-如何创建MailContainer actor的实例?我在你的帖子里没有看到这方面的代码。还有,当它失败时,会出现什么异常?下面是以前的actor@Override public void preStart()引发异常{System.out.println(“邮件收集器preStart:{}”);getContext().actorOf(Props.create(MailContainer.class,result),“one”);}的代码。通过这些更改,我看到了另一个错误,你们能看一下这个简单的项目吗?这是一个链接,在tomcat下运行,它是maven项目,您得到的错误是什么?查看Mailcollector类的代码,您有以下行
getContext().actorOf(SpringExtProvider.get(getContext().system()).props(MailContainer.class.getSimpleName()),“one”)-您需要在此处使用Springbean的名称,例如“mailContainer”,而不是mailContainer.class.getSimpleName()。也许这就是问题所在。是的,在这之后我又出现了一个错误[error][08/13/2014 14:31:09.388][AkkaJavaSpring-akka.actor.default-dispatcher-6][akka://AkkaJavaSpring/user/mailCollector/one]没有为作用域“session”注册作用域,当创建Springbean session时,没有区别,相同的错误..暂时可以从SpringService中删除@Scope注释,使其成为一个单例,看看是否有效?好的。。据我所知,如果我使用Spring,那么所有与参与者相关的操作都应该通过Spring进行,因为Akka应该是中间件,我将输入数据传输给参与者,并在最后输出数据。
@Override
public void preStart() throws Exception {
    System.out.println("Mail collector preStart: {} ");
    getContext().actorOf(Props.create(MailContainer.class, result), "one");
}
@Override
public void preStart() throws Exception {
    System.out.println("Mail collector preStart: {} ");
    getContext().actorOf(SpringExtProvider.get(getContext().system()).props("mailContainer"), "one");
}