Ответ в том, что ваш пример не ошибочен сам по себе, но есть несколько возможных подводных камней.
Вы поместили аннотацию на установщик, а не на получатель. Хотя JavaDoc для @XmlAttribute не устанавливает каких-либо ограничений на это, другие аннотации (например, @XmlID) специально разрешают аннотацию либо для установщика, либо для получателя, но не для обоих.
Обратите внимание, что @XmlAttribute ожидает атрибут, а не элемент. Кроме того, поскольку он анализирует атрибут, он не может быть сложным типом. Таким образом, EGroup может быть перечислением, возможно?
Я расширил ваш пример и добавил несколько утверждений, и он работает «на моей машине», используя последнюю версию Java 6.
@XmlRootElement
@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.PROPERTY)
public class E {
private EGroup groupDefinition;
public EGroup getGroupDefinition () {
return groupDefinition;
}
@XmlAttribute
public void setGroupDefinition (EGroup g) {
groupDefinition = g;
}
public enum EGroup {
SOME,
OTHERS,
THE_REST
}
public static void main(String[] args) throws JAXBException {
JAXBContext jc = JAXBContext.newInstance(E.class);
E eOne = new E();
eOne.setGroupDefinition(EGroup.SOME);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter writer = new StringWriter();
m.marshal(eOne, writer);
assert writer.toString().equals("<e groupDefinition=\"SOME\"/>");
E eTwo = (E) jc.createUnmarshaller().unmarshal(new StringReader(writer.toString()));
assert eOne.getGroupDefinition() == eTwo.getGroupDefinition();
}
}