Gerar XSD a partir de classe Java

11 respostas
A

oi

Como eu faço para gerar XSD a partir de código Java? Eu vi que para isso eu preciso usar a API JAXB

Neste caso eu precisaria fazer algo do tipo

JAXBContext jc = JAXBContext.newInstance(com.pacote.ClasseJava.class);
			
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal( poElement, System.out );

Eu vi que o Castor serve para o processo inverso, ou seja, XSD para Java

Estou com dúvida para definir o poElement que seria um JAXBElement, certo?

Existe algum plugin para o Eclipse para trabalhar com o JAXB? Achei a API um pouco complicada e pouca documentação/exemplos

Se alguém puder me ajudar agradeço desde já :)

11 Respostas

A

Olhando aqui eu vi que eu posso anotar as minhas classes e usar o schemagen.bat pra gerar os meus .xsd, o que acho que facilita as coisas…

Entretando quando eu rodo em linha de comando estou encontrando

Acho que estou configurando algo errado, alguém já utilizou esse cara??

A

Na linha de comando vai na pasta onde está sua classe java e digita:

Que ele gera o o xsd pra você.

A

Arisson Leal:
Na linha de comando vai na pasta onde está sua classe java e digita:

Que ele gera o o xsd pra você.

oi Arisson,

Então, eu já fiz isso, mas ele está dando aquele erro de classpath que coloquei acima, existe alguma variável de ambiente para setar? estou no windows, e defini apenas um JAXB_HOME

abs

A

Só tenho a JAVA_HOME e CLASSPATH setada.

Acabei de fazer um teste aqui e funcionou blz.

Classe java:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "aluno")
@XmlAccessorType(XmlAccessType.FIELD)
public class TesteJaxb {
	@XmlElement(required = true)
	private String nome;
	@XmlElement(required = true)
	private String email;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}
Comando:
schemagen TesteJaxb.java
Xsd gerado schema1.xsd:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="aluno" type="testeJaxb"/>

  <xs:complexType name="testeJaxb">
    <xs:sequence>
      <xs:element name="nome" type="xs:string"/>
      <xs:element name="email" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Se você digita xjc -version você consegue visualizar a versão do jaxb, talvez pode ser algum problema de versão.. não tenho muita certeza.

D:\>xjc -version
xjc version "JAXB 2.1.3 in JDK 1.6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.3 in JDK 1.6)
A

oi Arisson,

realmente o CLASSPATH da minha máquina estava zuado, agora eu consegui fazer, gerou alguns erros mas eu tenho que consertar o mapeamento

Valeu pela ajuda

A

oi

quando eu faço o xjc -version estou encontrando

xjc version "2.0-b26-ea3"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build 2.0-b
26-ea3)

acho que falta alguma configuração de variável de ambiente, tentei fazer schemagen.bat na mesma classe que mandou usando -classpath …\lib e me gera erro

at com.sun.tools.jxc.apt.SchemaGenerator$1.process(SchemaGenerator.java: 68) at com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor. process(AnnotationProcessors.java:60) at com.sun.tools.apt.comp.Apt.main(Apt.java:454) at com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:448) at com.sun.tools.apt.main.Main.compile(Main.java:1075) at com.sun.tools.apt.main.Main.compile(Main.java:938) at com.sun.tools.apt.Main.processing(Main.java:95) at com.sun.tools.apt.Main.process(Main.java:85) at com.sun.tools.apt.Main.process(Main.java:67) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.sun.tools.jxc.SchemaGenerator$Runner.main(SchemaGenerator.java:14 2) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.sun.tools.jxc.SchemaGenerator.run(SchemaGenerator.java:116) at com.sun.tools.jxc.SchemaGenerator.run(SchemaGenerator.java:32) at com.sun.tools.jxc.SchemaGenerator.main(SchemaGenerator.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.sun.tools.jxc.SchemaGeneratorFacade.main(SchemaGeneratorFacade.ja va:20)

repare que o xjc nao mostra a versão do JDK, não sei se tem a ver…

como você definiu as suas variáveis JAVA_HOME e CLASSPATH para o JAXB ??

abs

A

oi

parece que existe uma mudança entre versões, agora por exemplo eu tenho

A

Minhas variáveis de ambiente estão apontando pra minha instalação do Java, estou usando o JAXB que vem com o próprio Java.

Estou usando o Java 1.6

JAVA_HOME = C:\Arquivos de programas\Java\jdk1.6.0_06
CLASSPATH = .;C:\Arquivos de programas\Java\jre1.6.0_06\lib

A

oi

pois é, o meu JAVA_HOME estava apontando para o java5, o JAXB vem junto a partir do Java6, para usar ele eu tinha instalado este cara, acho que por isso estava encontrando algumas incompatibilidades…

vlw

O

o xjc gera classes a partir de xsds… existe alguma classe que faça esse trabalho de ler o xml e gerar outras classes java?
ou melhor ainda, um plugin do eclipse que faça isso pra gente pro exemplo: existe a opção no eclipse assim: new-> jaxb-> schema from jaxb classes…
poderia haver algo inverso (classes from schema)? existe plugin pra isso?

V

Boa noite pessoal, parece que teve mudanças na versão do jdk 6 para o 7 alguém consegui gerar o xsd com a versão 7?

Criado 27 de outubro de 2008
Ultima resposta 18 de out. de 2012
Respostas 11
Participantes 4