/ / HttpServletRequest injection na RequestScoped bean CDI - java, jax-rs, httprequest, cdi, bezpaństwowiec

HttpServletRequest wstrzyknięcie CDI komponentu RequestScoped bean - java, jax-rs, httprequest, cdi, bezpaństwowiec

Szukam sposobu, aby wstrzyknąć @RequestScoped niestandardowa klasa do mojej @Stateless Punkt końcowy JAX-RS:

Chcę za każdym razem, gdy aplikacja otrzyma żądanie, moja klasa niestandardowa jest wstrzykiwana do mojego punktu końcowego JAX-RS.

Klasa niestandardowa:

@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 ...
}

Więc deklaruję swoje CurrentTransaction klasa jako @RequestScoped w celu inicjalizacji za każdym razem, gdy otrzymywane jest żądanie. Aby to zrobić, muszę uzyskać dostęp do HttpServletResquest w celu uzyskania parametrów nagłówka.

Punkt końcowy 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 przybywa, aby wykonać konstruktor CurrentTransaction klasa. Jednak, HttpServletRequest pole żądania nie zostało zainicjowane (wstrzyknięte).

Co ja robię źle?

Odpowiedzi:

1 dla odpowiedzi № 1

Późna odpowiedź na to pytanie - być może przydatna dla innych czytelników: zastrzyk zależności CDI odbywa się w następującej kolejności:

  1. konstruktor jest wywoływany
  2. pola są wstrzykiwane
  3. @PostConstruct wywoływana jest metoda z adnotacją

Ostatni punkt to miejsce, w którym chcesz wkroczyć do dalszej inicjalizacji, która wymaga dostępu do wstrzykiwanych pól:

@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");
}