Pergunta

Se eu estou usando JAXB como parte de Metro Web Services sob GlassFish V2, como é que JAXB tell para adicionar:

 <xsd:any/> and <xsd:anyAttribute/>

tags às minhas tipos complexos gerados de modo que se eu fizer mudanças no futuro para adicionar elementos ou atributos para a minha resposta objetos então meus clientes atuais não vai quebrar.

documentação JAXB parece um pouco carente.

Foi útil?

Solução 2

Ok isto é como eu fiz isso trabalho:

import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;


public class SchemaExtensible
{
    @XmlAnyElement(lax=true)
    private List<Element> otherElements;

    @XmlAnyAttribute
    private Map<QName,Object> otherAttributes;
}

Não é o ideal, porque agora eu tenho que estender esta classe para cada classe de resposta que eu quero ser extensível (e em alguns casos isso me impede de se estende desde uma classe pedido em vez disso). Se estes 2 Método & campo anotações nível poderia ser melhorado para permitir que eles sejam adicionados no nível de classe, em seguida, eles poderiam simplesmente estar dizendo "adicionar as tags apropriadas ao esquema e simplesmente jogar fora os dados se encontrou", que seria doce.

De qualquer forma as extremidades fragmento de esquema parecido com isto:

<xs:complexType name="SchemaExtensible">
  <xs:sequence>
    <xs:any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="skip"/>
 </xs:complexType>

Para mim, permitindo que esta extensibilidade para a resposta somente objetos é preferível ao serviço web de versão, uma vez que lhe permite evoluir o bit esquema a pouco, se assim o desejarem, sem a dor de cabeça de gerenciar muitas versões diferentes, e sem a preocupação de que todos os clientes existentes vai quebrar se você adicionar um único novo atributo ou elemento a um objeto de resposta.

Outras dicas

Basta usar o tipo java.lang.Object. JAXB por padrão irá gerar xsd: any. Voltei com sucesso uma instância org.w3c.dom.Node a partir de um método de serviço web com java.lang.Object como o tipo de retorno. I imaging haverá algo semelhante para xsd:? AnyAttribute - talvez usando tipo de retorno de objetos e a anotação XmlAttribute JAXB

Adição: As seguintes anotações parecem que atingir seus objetivos. Ambos são parte da especificação JAXB 2.0.

@XmlAnyAttribute @XmlAnyElement

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top