2015-05-05 5 views
3

Я ищу способ для того, чтобы придать @RequestScoped пользовательский класс в моем @Stateless JAX-RS конечной точки:HttpServletRequest инъекции на RequestScoped боба CDI

Я хочу, чтобы каждый раз, когда приложение получает запрос мой пользовательский класс впрыскивается в моей конечной точке JAX-RS.

Пользовательский класс:

@RequestScoped 
public class CurrentTransaction { 

    private String user; 
    private String token; 

    @PersistenceContext(name="mysql") 
    protected EntityManager em; 

    @Inject HttpServletRequest request; 

    public CurrentTransaction() { 
     this.user = request.getHeader("user"); 
     this.token = request.getHeader("token"); 
    } 

    //getters and setters ... 
} 

Таким образом, я заявляю о своем CurrentTransaction класс как @RequestScoped для того, чтобы инициализировать каждый раз при получении запроса. Для этого мне нужно получить доступ к HttpServletResquest, чтобы получить параметры заголовка.

JAX-RS конечная точка:

@Stateless 
@Path("/areas") 
public class AreasEndpoint { 

    @PersistenceContext(unitName = "mysql") 
    protected EntityManager em; 

    @Inject 
    protected CurrentTransaction current_user_service; 

    @POST 
    @Path("postman") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @Authentication 
    public Response create(AreaRequest request) { 

     if (this.current_user_service.getUser() == null) { 
      System.out.println("Go!!!"); 
      return Response.status(Status.FORBIDDEN).build(); 
     } else { 
      System.out.println("---- user: " + this.current_user_service.getUser()); 
      System.out.println("---- token: " + this.current_user_service.getToken()); 
     } 
    } 

    // ... 
} 

CDI прибыть выполнить конструктор CurrentTransaction класса. Однако поле запроса HttpServletRequest не инициализируется (вводится).

Что я делаю неправильно?

+1

Где вы размещаете? Включить версии. Любые трассировки стека также помогут. –

ответ

1

Поздний ответ на этот один - может быть полезным для других читателей: инъекции зависимостей в CDI производится в следующем порядке:

  1. конструктор вызывается
  2. поля вводят
  3. @PostConstruct аннотированный метод вызывается

Последнее, что вы хотите сделать для дальнейшей инициализации, которая нуждается в доступе к инъекции lds:

@Inject HttpServletRequest request; 

public CurrentTransaction() { 
    // field injection has not yet taken place here 
} 

@PostConstruct 
public void init() { 
    // the injected request is now available 
    this.user = request.getHeader("user"); 
    this.token = request.getHeader("token"); 
} 
+0

Вы предлагаете мне «вводить» поля в '@ PostConstruct'? Не могли бы вы предоставить мне какой-нибудь код помощи? – Jordi

+0

@ user3227319 Пожалуйста, просмотрите мое изменение для необходимых изменений в коде. –