Ошибка CDI HK2 в приложении JaxRS

Я написал приложение JaxRS для Glassfish 4. Он использует Jackson 2. Я могу собрать его без каких-либо проблем, но когда я его развертываю, я получаю одну или несколько из следующих 4 ошибок.

Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [IterableProvider<InjectionResolver<Object>>]

и/или

org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001414 Bean name is ambiguous. Name JerseyClassAnalyzer resolves to beans [Managed Bean ...

и/или

org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [MultivaluedParameterExtractorProvider] ...

и/или

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Ref<ContainerRequest>]

Насколько я знаю, последнее исключение может быть выдано, когда стеклянная рыба дважды пытается загрузить класс?

Я загрузил скриншот своих прямых и косвенных зависимостей. http://i.stack.imgur.com/HEtb1.png

что касается других решений, я пытался добавить <scope>provided</scope> к пакетам, которые включали эти классы. --> безуспешно

Есть ли у вас какие-либо идеи?

ИЗМЕНИТЬ 1:

мой РесурсКонфиг:

@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends ResourceConfig {

    public ApplicationConfig() {
        register( JacksonFeature.class );
    }

    private void addMyResources() {
        //a lot of resources.
    }
}

чтобы включить Джексона 2:

public class JacksonFeature implements Feature {

    public boolean configure( final FeatureContext context ) {

        String postfix = '.' + context.getConfiguration().getRuntimeType().name().toLowerCase();

        context.property( CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix, true );

        context.register( JsonParseExceptionMapper.class );
        context.register( JsonMappingExceptionMapper.class );
        context.register( JacksonJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class );

        return true;
    }
}

много таких объектов:

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.None.class, property = "id", scope=Address.class)
//the JsonIdentityInfo is the reason i need Jackson 2
public class Address implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String postalCode;
    private String city;
    private String country;
    private String street;
    private String houseNumber;
    @Embedded
    private Coordinate coordinate;
    //getters, setters , etc.
}

то у меня есть много таких DAO:

@Stateless
public class AddressDao extends GenericDao {
    public Address getAddress(long id){
        return em.find(Address.class, id);
    }

    public List<Address> getAddresses(){
        List<Address> address = em.createQuery("SELECT a FROM Address a", Address.class).getResultList();
        return address;
    }
}

и много таких ресурсов:

@Path("dummy")
@Stateless
public class DummyResource {

    @Context
    private UriInfo context;
    @Inject userAuth user;
    @Inject addressDao AddressDao;

    public DummyResource() {
    }

    @GET
    @Produces("application/json")
    public List<Address> getAddress() {
        return AddressDao.getAddresses();
    }

}

РЕДАКТИРОВАТЬ 2:

Я создал новый тестовый проект. как только я добавляю зависимость к org.glassfish.jersey.server, я получаю ошибки.

ИЗМЕНИТЬ 3:

я сделал тестовое приложение с ошибкой:

http://www.file-upload.net/download-8459084/testApplication_20131229.rar.html


person Laokoon    schedule 24.12.2013    source источник
comment
я развертываю его как войну.   -  person Laokoon    schedule 30.12.2013


Ответы (1)


Если вы не используете CDI в своем приложении, вы можете сделать это при развертывании приложения:

asadmin развернуть --property implicitCdiEnabled=false

Это отключит неявное сканирование классов, выполняемое CDI при развертывании приложения. Дополнительную информацию об использовании CDI по умолчанию можно найти здесь: https://blogs.oracle.com/theaquarium/entry/default_cdi_enablement_in_java

Если вы используете CDI, вы можете попробовать добавить beans.xml в банку Jersey в своем приложении с этим:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
   http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   bean-discovery-mode="none">
</beans>
person jwells131313    schedule 24.12.2013
comment
хорошо, я использую CDI, и мне это нужно. - person Laokoon; 25.12.2013
comment
jar доступен только для чтения. или вы имели в виду мое приложение? когда я добавляю его в свое приложение, это ничего не меняет. - person Laokoon; 26.12.2013
comment
Думаю, мне нужно точно понять, что вы развертываете. Вы разворачиваете ухо или войну? В любом случае вам, вероятно, потребуется переупаковать только майку в собственное ухо с помощью вышеуказанного файла beans.xml, чтобы отключить CDI для этого компонента. По правде говоря, Джерси должен поставляться из коробки с таким beans.xml только для этой проблемы, вам, вероятно, следует открыть с ними Jira. - person jwells131313; 26.12.2013
comment
хорошо, я опишу в своем первоначальном запросе, что я делаю в своем приложении. - person Laokoon; 28.12.2013
comment
Мне нужно использовать org.glassfish.jersey.server.ResourceConfig и org.glassfish.jersey.CommonProperties. я должен поместить beans.xml в оба из них? - person Laokoon; 28.12.2013
comment
добавил ссылку на тестовое приложение с той же ошибкой может поможет - person Laokoon; 30.12.2013
comment
Я не могу получить доступ к вашему тестовому приложению. Возможно, это связано с корпоративным брандмауэром. - person jwells131313; 31.12.2013
comment
Что ж. где я могу загрузить его для вас? бр - person Laokoon; 02.01.2014