Estoy construyendo una aplicación que proporciona un servicio REST JAX-RS utilizando JPA (EclipseLink). Al exponer entidades de usuario a través de JSON, estoy usando la anotación @XmlTransient en algunos campos (por ejemplo, el campo de contraseña) para ocultarlas de la representación JSON. Al enviar una operación de creación o actualización (POST / PUT), me gustaría volver a completar los campos faltantes para que JPA realice la operación correctamente.

Mi enfoque actual es que tengo un JsonDeserializer personalizado que se usa para deserializar al usuario y agregar los campos que faltan. Para esto, me gustaría inyectar (usando @Inject) un bean UserFacadeREST que maneja las cosas de JPA. Sin embargo, esta inyección falla y la instancia del bean es null (que luego, por supuesto, causa un NullPointerException).

Mi bean UserFacadeREST está anotado de la siguiente manera:

@Stateless
@LocalBean
@Path(UserFacadeREST.PATH)
public class UserFacadeREST extends AbstractFacade<User> {
    //...
}

Mi UserDeserilizer (personalizado JsonDeserializer):

public class UserDeserializer extends JsonDeserializer<User> {

  @Inject
  private UserFacadeREST userFacade;

  @Override
  public User deserialize(JsonParser parser, DeserializationContext context) throws IOException,
      JsonProcessingException {
    JsonNode node = parser.getCodec().readTree(parser);
    int userId = (Integer) ((IntNode) node.get("userID")).numberValue();
    System.out.println(userId);
    User user = userFacade.find(userId); // This line produces the NullPointerException
    return user;
  }

}

Que luego uso en mi entidad de usuario con @JsonDeserialize:

@Entity
@Table(name = "User")
@XmlRootElement
@JsonDeserialize(using = UserDeserializer.class)
public class User implements Serializable {
    // ...
}

He incluido un archivo bean.xml en mi carpeta WEB-INF con bean-discovery-mode configurado en all. ¿Qué me estoy perdiendo?

2
Severin 24 ago. 2016 a las 00:45

1 respuesta

No estoy muy familiarizado con CDI, pero una rápida búsqueda en Google me lleva a creer que bean-discovery-mode debería ser all, annotated o none ({{X4 }} no es un valor válido). Referencia

Si eso no lo soluciona, podría ser el mismo problema que tendría Spring: tienes que declarar tu UserDeserializer como un bean para que se aplique la inyección de dependencia.

EDITAR: Acabo de encontrar esta otra pregunta que es básicamente la misma problema que está teniendo.

En última instancia, probablemente necesite rediseñar la lógica para llamar a userFacade después de la deserialización.

1
Community 23 may. 2017 a las 12:01