2016-02-01 2 views
0

Я разрабатываю приложение, использующее поток JSF для управления виртуализованной деятельностью, которая может быть запущена зарегистрированным пользователем.Внедрение FlowScoped bean в веб-службу REST на Джерси

Одна страница потока нуждается в пользовательском JavaScript-коде, написанном в AngularJS, поэтому я создал небольшую службу REST Джерси для обмена данными между AngularJS и компонентом (очевидно, услуга должна вызываться только тогда, когда пользователь использует эту страницу потока) ,

Внутри службу мне нужен боб FlowScoped, но если я пытаюсь сделать

@Path("rest") 
@RequestScoped 
public class MyResource { 

    @Inject 
    MyFlowScopedBean myFlowScopedBean; 

    // ... 
} 

следующим исключение отбрасывается:

exception java.lang.NullPointerException at com.sun.faces.flow.FlowCDIContext.getCurrentFlow 

Итак, я использую сеанс контекстного боб связанный пользователю для извлечения бина с использованием следующего обходного пути:

@Named 
@FlowScoped("myFlow") 
public class MyFlowScopedBean { 

    @Inject 
    UserDataBean userDataBean; 

    @PostConstruct 
    public void init() { 
     userDataBean.setMyFlowScopedBean(this); 
    } 

    // ... 
} 

@Named 
@SessionScoped 
public class UserDataBean { 

    private MyFlowScopedBean myFlowScopedBean; 

    public getMyFlowScopedBean() { 
     return myFlowScopedBean; 
    } 
    public setMyFlowScopedBean(MyFlowScopedBean myFlowScopedBean) { 
     this.myFlowScopedBean = myFlowScopedBean; 
    } 

    // ... 
} 

@Path("rest") 
@RequestScoped 
public class MyResource { 

    @Inject 
    UserDataBean userDataBean; 

    private MyFlowScopedBean getMyFlowScopedBean() { 
     return userDataBean.getMyFlowScopedBean(); 
    } 

    // ... 
} 

Есть ли лучшее способ сделать это? И, что более важно, следует ли мне это делать или я нарушаю некоторые лучшие практики/соглашения?

(я развертывание на Glassfish 4.1)

Спасибо!

+0

JAX-RS и JSF - полностью независимые каркасы, имеющие свои разные цели и не могут взаимодействовать друг с другом в любом случае на стороне сервера. Дизайн проваливается и может потребоваться пересмотреть. – Tiny

+0

Я видел различные примеры CDI и Rest services mixed (также в книге JBoss Weld есть заключительная глава, посвященная AngularJS). Мне нужна только одна страница моего потока, используя JavaScript + REST вместо подхода JSF. – xonya

ответ

0

Вместо использования JSF FlowScoped можно получить что-то очень похожее, используя ConversationScoped.

Из книги «JBoss Weld КДИ для платформы Java» Кен Финнигана:

был разработан для использования в частности, с помощью JSF Разговор реализации контекста в Weld. [...] В CDI 1.1 жесткая связь с JSF будет удалена, что позволит использовать контекст беседы с другими веб-фреймворками.

Здесь минимальный рабочий пример (вдохновленный this blog post):

@Named("foo") 
@ConversationScoped 
public class FooBean implements Serializable { 

    @Inject 
    Conversation conversation; 

    public String getConversationId() { 
     return conversation.getId(); 
    } 

    @PostConstruct 
    public void init() { 
     conversation.begin(); 
    } 

    // ... 
} 

@Path("foo") 
@ConversationScoped 
public class FooResource implements Serializable { 

    @Inject 
    FooBean fooBean; 

    @GET 
    @Path("myMethod") 
    public String myMethod() { 
     // ... 
    } 
} 

В .xhtml:

<script> 
    var CID = '#{foo.conversationId}'; // <-- EL 
    $.get('/myApp/foo/myMethod?cid=' + CID); 
</script> 

Предупреждение: обратите внимание, используя @FormParam: гризли seems to have problems с ним.

Если вы хотите получить полный пример создания мастера с использованием области разговора, просмотрите this post.

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