Я создаю приложение, предоставляющее службу REST JAX-RS, используя JPA (EclipseLink). При экспонировании объектов пользователя над JSON я использую аннотацию @XmlTransient
в некоторых полях (например, поле пароля), чтобы скрыть их от представления JSON. При отправке операции создания или обновления (POST/PUT) я хотел бы снова заполнить недостающие поля, чтобы JPA корректно выполнил операцию.Включение сеанса сеанса без состояния в пользовательский JsonDeserializer завершается
Мой текущий подход заключается в том, что у меня есть пользовательский JsonDeserializer
, который используется для десериализации пользователя и добавления недостающих полей. Для этого я хотел бы ввести (используя @Inject
) фасоль UserFacadeREST
, который обрабатывает JPA-материал. Однако эта инъекция терпит неудачу, а экземпляр компонента - null
(который, конечно же, вызывает NullPointerException
).
Мой UserFacadeREST
боб 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 {
// ...
}
Я включил файл bean.xml в свой W EB-INF с bean-discovery-mode
установлена в all
. Что мне не хватает?
Вы можете только @ Включить объекты, управляемые контейнером CDI. Поскольку 'UserDeserializer' не объявляется управляемым компонентом, инъекция зависимости не должна происходить, поскольку контейнер не будет предоставлять вам эту услугу. – scottb
Спасибо. Итак, как я объявляю свой UserDeserializer управляемым компонентом? Я пробовал с помощью '@ ApplicationScoped' и' @ Singleton', но никто не работал ... – Severin