Jboss WELD-001408未满足的依赖项

Jboss WELD-001408未满足的依赖项,jboss,ejb,jboss7.x,cdi,jboss-arquillian,Jboss,Ejb,Jboss7.x,Cdi,Jboss Arquillian,我有一个非常著名的错误,但我不能解决它。 我正在尝试为我的应用程序运行arqullian测试。 我已经根据官方文件做了一切。 为解决这个问题而进行的长期探索毫无结果 16:49:42,713 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."test.war".WeldService: org.jboss.msc

我有一个非常著名的错误,但我不能解决它。 我正在尝试为我的应用程序运行arqullian测试。 我已经根据官方文件做了一切。 为解决这个问题而进行的长期探索毫无结果

 16:49:42,713 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."test.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."test.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Sender] with qualifiers [@Default] at injection point [[field] @Inject com.test.test2.ejb.AppManagerBean.sender]
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:83)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_13]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_13]
    at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_13]
Caused by: org.jboss.weld.exceptions.DeploymentException: 

    WELD-001408 Unsatisfied dependencies for type [Sender] with qualifiers [@Default] 

    at injection point [[field] @Inject com.test.test2.ejb.AppManagerBean.sender]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
    ... 5 more
我的测试班:

AppManagerBean.java

import com.google.android.gcm.server.Constants;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;
import com.google.common.base.Strings;
import com.test.test2.json.JacksonObjectMapperProvider;
import com.test.test2.model.*;
import com.test.test2.rest.HttpStatusException;
import com.test.test2.rest.NotFoundException;
import com.test.test2.rest.model.ProximityModel;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ejb.Asynchronous;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.*;
import javax.persistence.criteria.*;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.List;


/**
 * Stateless EJB bean containing entire business logic implementation
 */
@Local(AppManager.class)
@Stateless
public class AppManagerBean implements AppManager {

    public static final String
            GCM_ENTER_ACTION = "enter",
            GCM_EXIT_ACTION = "exit",
            PARAM_DATA_JSON = "proximityModel",
            PARAM_CUSTOMER_ID = "customerId",
            PARAM_ACTION = "action";

    @Inject
    EntityManager em;

    @Inject
    Sender sender;
....
}
最后是测试CustomerCollectionResource的类

@Path("customer/")
@RequestScoped
public class CustomerCollectionResource {

    final static int CACHEABLE_SECONDS = 0;
    @EJB
    private AppManager manager;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response list(@QueryParam("email") String email) {

        final List<Customer> entities = manager.listCustomers(email);

        if(entities.size() == 0)
            throw new NotFoundException("There is no any customer");

        ListModel<ListItem> result = new ListModel<ListItem>(entities.size());
        result.itemType = ListItem.MEDIA_TYPE;
        final UriBuilder itemLink = UriBuilder.fromResource(CustomerResource.class);
        for (Customer entity : entities) {
            result.add(new ListItem(entity.getName(), itemLink.build(entity.getId())));
        }
        CacheControl cc = new CacheControl();
        cc.setMaxAge(CACHEABLE_SECONDS);
        cc.setPrivate(true);
        return Response.ok(result).cacheControl(cc).build();
    }


}

是的,我还认为GcmSenderProducer缺失,因此无法正确注入Sender类,因为它看起来没有arg构造函数,我猜是构造函数。

和Sender?寄件人在哪里?另外,由于您使用的是web存档,我不确定您的应用程序服务器是什么,但将beans.xml放在web-INF中。正确率更高。添加生产者代码。当我将beans.xml移动到web inf时,没有任何变化。我不认为把它放在web inf中会改变什么,但这被认为是最合适的地方。能否尝试将
GcmSenderProducer
显式添加到存档中?由于您的所有包名都已删除,因此很难判断是否包含该包。请注意,您可能仍然会遇到一些奇怪的行为,因为
Sender
很可能是一个外部库,但您将其包括在WAR中。也许producer方法的类必须是一个bean?试着把它变成无状态的
@Path("customer/")
@RequestScoped
public class CustomerCollectionResource {

    final static int CACHEABLE_SECONDS = 0;
    @EJB
    private AppManager manager;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response list(@QueryParam("email") String email) {

        final List<Customer> entities = manager.listCustomers(email);

        if(entities.size() == 0)
            throw new NotFoundException("There is no any customer");

        ListModel<ListItem> result = new ListModel<ListItem>(entities.size());
        result.itemType = ListItem.MEDIA_TYPE;
        final UriBuilder itemLink = UriBuilder.fromResource(CustomerResource.class);
        for (Customer entity : entities) {
            result.add(new ListItem(entity.getName(), itemLink.build(entity.getId())));
        }
        CacheControl cc = new CacheControl();
        cc.setMaxAge(CACHEABLE_SECONDS);
        cc.setPrivate(true);
        return Response.ok(result).cacheControl(cc).build();
    }


}
public class GcmSenderProducer {

    @Resource String senderId;

    @Produces public Sender getSender() {
        return new Sender(senderId);
    }

}