Запретить привязку элементов JAXB при создании объекта - PullRequest
1 голос
/ 29 апреля 2011

У меня есть класс следующим образом:

    @XmlRootElement(name="User")
    @XmlAccessorType(XmlAccessType.NONE)
    public class User {

    private int id;
    private String name;

    public User() { }

    @XmlAttribute
    public int getID() {
      return id;
    }

    public void setID() {
      this.id = id;
    }

    @XmlElement
    public String getName() {
      return first + " " + last;
    }

    public void setName(String name) {
      this.name = name;
    }

    // other class code   
  }

Я использую этот класс для службы JAX-RS. Когда клиент желает создать нового пользователя, необходимо отправить XML-представление следующего формата.

<User>
  <name>John Doe</name>
</User>

При получении такого фрагмента мой сервис правильно создает нового пользователя. Однако, если клиент включает в себя атрибут идентификатора для пользователя (например, <User id="100">...</User>), значение идентификатора атрибута назначается пользователю.

Как вы можете себе представить, я хочу использовать поле ID в качестве первичного ключа класса User и не хочу, чтобы пользователь мог его указать. Однако когда я возвращаю представление экземпляра User (также в XML), я хочу иметь возможность указать идентификатор в качестве атрибута.

Как мне этого добиться?

1 Ответ

1 голос
/ 29 апреля 2011

Есть несколько способов сделать это:

Опция # 1

Вы можете обнулить поле идентификатора, когда операция создания завершена.

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(User user) {
    user.setId(0);
    entityManager.persist(customer);
}

Option # 2

В качестве альтернативы вы можете иметь второй класс User без поля id, который вы используете для параметра операции создания:

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(UserWithoutID userWithoutID) {
    User user = new User();
    // Copy from userWithoutID to user
    entityManager.persist(customer);
}

Опция # 3

Если вы используете доступ к свойству, другой вариант - предоставить только получатель для вашего свойства id.Затем JAXB включит запись (маршал), но не чтение (не маршал).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...