Альтернативная инъекция CDI не работает должным образом - PullRequest
0 голосов
/ 12 июня 2019

У меня есть два класса, которые реализуют интерфейс.Один отмечен как @Default и @Named.Другой аннотируется как @Alternative

@Default
@Named
public class ListService implements IListService {
    @Override
    public void doSomething()
       print("default");
    }
}

@Alternative
public class ListServiceMock extends BaseServiceMock implements IListService {
    @Override
    public void doSomething()
       print("mock");
    }

}

Инжекция происходит следующим образом:

public class SomeNavigator extends AbstractNavigator {

    private IListService listService;

    @Inject
    public SomeNavigator(IListService listService) {
        this.listService = listService;
    }

    public void doNavigate() {
       this.listService.doSomething(); // Always prints "mock"
    }
}

Мой beans.xml файл находится в / src / main / webapp / WEB-INF /beans.xml, а проект создается и упаковывается Maven как файл war и развертывается в JBoss EAP 6.3.3.GA (в контейнере Docker)

Я считаю, что альтернативный компонентListServiceMock будет только введено, если я включу его в файл beans.xml следующим образом:

<?xml version="1.0"?>
<beans bean-discovery-mode="all" version="1.1"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:weld="http://jboss.org/schema/weld/beans"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                     http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">

    <alternatives>
        <class>service.alternative.ListServiceMock</class>
    </alternatives>
</beans>

Однако независимо от того, находится ли этот раздел в beans.xml или нетАльтернативный боб всегда используется.

Есть ли причина, по которой кажется, что файл beans.xml игнорируется в этом случае, а альтернативный компонент всегда выбран для инъекции?

1 Ответ

0 голосов
/ 18 июня 2019

Похоже, связано с пространством имен XML в файле beans.xml.Я переключился на эти пространства имен, и теперь он работает.

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
...