我正在构建一个应用程序,该应用程序使用JPA(EclipseLink)提供JAX-RS REST服务。在通过JSON公开用户实体时,我在某些字段(例如密码字段)上使用@XmlTransient
注释来将其隐藏在JSON表示中。发送创建或更新(POST/PUT)操作时,我想再次填充缺失的字段,以便JPA将正确执行操作。将无状态会话Bean注入自定义JsonDeserializer失败
我目前的做法是我有一个自定义JsonDeserializer
用于反序列化用户并添加缺少的字段。为此我想注入(使用@Inject
)处理JPA-stuff的UserFacadeREST
bean。然而,这个注入失败,并且bean实例是null
(这当然会导致NullPointerException
)。
我UserFacadeREST
bean是annoted如下:
@Stateless
@LocalBean
@Path(UserFacadeREST.PATH)
public class UserFacadeREST extends AbstractFacade<User> {
//...
}
我UserDeserilizer
(定制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;
}
}
然后我在我的用户实体使用带有@JsonDeserialize
:
@Entity
@Table(name = "User")
@XmlRootElement
@JsonDeserialize(using = UserDeserializer.class)
public class User implements Serializable {
// ...
}
我在我的W中包含了一个bean.xml文件带有bean-discovery-mode
的EB-INF文件夹设置为all
。我错过了什么?
您只能@Inject入CDI容器管理对象。由于'UserDeserializer'没有被声明为托管bean,因此不应该发生依赖注入,因为容器不会为您提供此服务。 – scottb
谢谢。那么如何声明我的UserDeserializer是一个托管bean?我试过'@ ApplicationScoped'和'@ Singleton',但都没有工作... – Severin