2016-10-27 5 views
0

У меня есть класс, которые выполняют как производители класса в пределах моих остальных услуг, которые так сделали:Как придать HttpServletRequest или Session из CDI

public class WebResources{ 


    @Produces 
    @RequestScoped 
    public FacesContext produceFacesContext() { 
     return FacesContext.getCurrentInstance(); 
    } 

    @Produces 
    public Logger produceLog(InjectionPoint injectionPoint) { 
     return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
    } 
} 

Теперь я хочу, чтобы произвести объект шахты с помощью HttpServletRequest или HttpSession как параметр. Что-то вроде этого:

@Produces 
@RequestScoped 
public MyObject getSecurityContext(InjectionPoint injectionPoint) 
{ 
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    return Utils.getMyObject(request); 
} 

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

ERROR [org.jboss.as.cli.CommandContext] { "JBAS014671: Failed услуги" => { "jboss.deployment.unit. \" zuora.ear \ ". WeldStartService" => "org.jboss.msc.service.StartException в сервисе jboss.deployment.unit. \" zuora.ear \ ". WeldStartService: не удалось запустить service Вызвать: org.jboss.weld.exceptions.DefinitionException: WELD-001406 Невозможно ввести [параметр 1] из [метода] @Produces @RequestScoped public it.infocert.zuora.rest.util.WebResources.getSecurityContext (InjectionPoint) в не-зависящий scomb bean "}} {" JBAS014671: Failed services "=> {" jboss.deployment.unit. \ "zuora.ear \". WeldStartService "=>" org.jboss.msc.service.StartException в службе jboss.deployment .unit. \ "zuora.ear \". WeldStartService: Не удалось запустить службу Вызвано: org.jboss.weld.exceptions.DefinitionException: WELD-001406 Невозможно ввести [параметр 1] из [метода] @Produces @RequestScoped public it .info

+1

Как я знаю, нет никакого способа ввести запрос с использованием только Weld. То, как я знаю и использую, это RequestResponseHolderFilter из deltaspike. С помощью этого фильтра вы можете ввести HttpRequest с квалификатором @Deltaspike. Для получения дополнительной информации см. Https://deltaspike.apache.org/documentation/servlet.html. Если вы не хотите/не можете использовать deltaspike, вы можете посмотреть его исходный код модуля сервлета. Это довольно просто. Вам нужно получить каждый запрос и сохранить его в переменной ThreadLocal. – temaleva

+0

BTW: Вы можете ввести 'HttpServletRequest' с CDI> = 1.1 – chkal

ответ

1

Вы должны удалить параметр InjectionPoint из вашей сигнатуры метода. Вы не можете нам InjectionPoint, если вы создаете фасонный объект с запросом, поскольку несколько точек впрыска получат тот же экземпляр (с запросом). Вы не используете точку инъекции в своем коде, поэтому ее можно удалить.

+0

Это нормально для меня, но как я могу ссылаться на HttpServletRequest? –

+0

В вашем 'getSecurityContext' вы получаете запрос от FacesContext. Итак, для чего вам нужен InjectionPoint? – chkal

+0

На самом деле этот фрагмент не работает; FacesContext currentInstance = FacesContext.getCurrentInstance(); return null –

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