2016-06-14 12 views
0

Возможно ли иметь компонент bean-интерфейса в проекте и реализацию этого компонента в другом проекте, который включает в себя предыдущий проект как зависимость?Интерфейс Bean и реализация Bean в разных проектах

У меня есть следующий интерфейс:

package com.proj1.util; 
import .....; 

public interface Notification { 

    addNotification(); 
    addError();  

} 

В том же проекте (т.е. proj1) У меня есть также следующий класс:

package com.proj1.util.exception; 
import .....; 

public class ExceptionHandler extends RuntimeException ... { 
    private String errorMessage; 

    @Override 
    public void handle() { 
     Util.getBeanInstance(Notification.class).addError(errorMessage); 
    }  

} 

Теперь во втором проекте я имею фактическую реализацию Notification, который является следующим:

package com.proj2.beans; 

@Named 
@ConversationScoped 
public class NotificationBean implements Notification, Serializable { 
    private static final long serialVersionUID = 1L; 

    ... 
} 

Эта ситуация приводит к e xception в Tomcat с сообщением «WebBeans контексте с тип области аннотаций @ConversationScoped не существует в текущем потоке»

Мое предложение было добавить завод, который производит мой NotificationBean но это, кажется, не сильно изменится.

package com.proj2.beans.cdi; 

import javax.enterprise.inject.New; 
import javax.enterprise.inject.Produces; 

import com.proj1.util.Notification; 

public class NotificationBeanFactory { 

    @Produces 
    public Notification create(@New NotificationBean notificationBean) { 
     return notificationBean; 
    } 
} 

Вопрос заключается в том, как я могу использовать компонент в проекте, в котором у меня есть только его интерфейс, а реализация боб в другом проекте. Является ли это возможным?

+0

Исключение предполагает, что рассматриваемый поток (тот, в котором делается попытка получить компонент) не является потоком запросов HTTP. Другими словами, недоступные для HTTP области, такие как HTTP-беседа и HTTP-сеанс, недоступны. Это правда? Почему именно это '@ ConversationScoped' то? Где именно вы ожидали, что контейнер сохранит экземпляр реального экземпляра? – BalusC

+0

Это приложение JSF, запрос выполнен из браузера, поэтому это HTTP-запрос. Хотя, вероятно, это потому, что разговор еще не начался. «NotificationBean» фактически должен управлять моими сообщениями (Ошибки, Предупреждения и т. Д.) Для всего моего приложения. Было бы более разумным сделать его сеансом? –

ответ

1

Исключение указывает на отсутствие бегущей беседы, поэтому я бы начал с определения, когда вы пытаетесь использовать bean-компонент и из какого класса.

Вашего код деталь показывает, что ExceptionHandler класса вызывает волшебную формулу, которую мы не знаем, что еще насчет:

Util.getBeanInstance(Notification.class).add(...); 

Попытки использовать это, когда нет активного разговора не может привести к исключению вы видите. Поэтому вы могли бы @Inject ExceptionHandler в NotificationBean, чтобы вы только когда-либо использовали его во время активной беседы.

Что касается вопроса Weld относительно интерфейса и имплантата в разных проектах; возможно. в вашем proj2 Weld будет просто идентифицировать фасоль NotificationBean, и среди их типов будет также Notification, поэтому вы можете затем @Inject Notification. Возможно, это не сработает наоборот - в proj1 вы не можете @Inject Notification, потому что у proj1 сам нет никакого компонента, который бы реализовал этот интерфейс.

+0

'Util.getBeanInstance (...)' - набор методов утилиты, которые я создал, которые используют BeanManager для получения bean-компонентов и возврата запрошенного компонента. Фактически вся конструкция работает, если нет разговора.И это именно то, что происходит, потому что мое приложение не работает до открытия определенного разговора и пытается вывести уведомление об ошибке. –

 Смежные вопросы

  • Нет связанных вопросов^_^