Можно ли аннотировать @XmlElement метод с нестандартным именем? - PullRequest
6 голосов
/ 03 ноября 2011

Вот что я делаю:

@XmlType(name = "foo")
@XmlAccessorType(XmlAccessType.NONE)
public final class Foo {
  @XmlElement(name = "title")
  public String title() {
    return "hello, world!";
  }
}

JAXB жалуется:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
JAXB annotation is placed on a method that is not a JAXB property
    this problem is related to the following location:
        at @javax.xml.bind.annotation.XmlElement(nillable=false, name=title, required=false, defaultValue=, type=class javax.xml.bind.annotation.XmlElement$DEFAULT, namespace=##default)
        at com.example.Foo

Что делать? Я не хочу (и не могу) переименовать метод.

Ответы [ 2 ]

5 голосов
/ 03 ноября 2011

Есть несколько вариантов:

Вариант № 1 - ввести поле

Если значение является постоянным, как в вашем примере, тогда вы могли бы ввести поле в свой класс домена и сделать так, чтобы JAXB отображало:

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(name = "foo")
@XmlAccessorType(XmlAccessType.NONE)
public final class Foo {
    @XmlElement
    private final String title = "hello, world!";

  public String title() {
    return title;
  }
}

Вариант № 2 - ввести свойство

Если значение рассчитано, вам нужно будет ввести средство доступа JavaBean и сопоставить его с JAXB:

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(name = "foo")
@XmlAccessorType(XmlAccessType.NONE)
public final class Foo {

  public String title() {
    return "hello, world!";
  }

  @XmlElement
  public String getTitle() {
      return title();
  }

}
3 голосов
/ 03 ноября 2011

Возможно, есть лучший способ, но первое, что приходит на ум, это:

@XmlElement(name = "title")
private String title;

public String getTitle() {
    return title();
}

Почему вы все равно не можете назвать свой метод в соответствии с соглашениями Java?

...