Duvida ao consumir WebService em Java

Estou com problemas de entendimento ao consumir em WebService em Java, consultei antes de vir perguntar mas não encontrei nada extremamente satisfatório que resolva minha dúvida.

Há um site onde eles dão um arquivo XML, e eu por vontade própria decidi testar criando algo para consumir isso em Java.

http://servicos.cptec.inpe.br/XML/capitais/condicoesAtuais.xml

<capitais> <metar> <codigo>SBAR</codigo> <atualizacao>24/02/2016 21:00:00</atualizacao> <pressao>1013</pressao> <temperatura>28</temperatura> <tempo>pn</tempo> <tempo_desc>Parcialmente Nublado</tempo_desc> <umidade>83</umidade> <vento_dir>110</vento_dir> <vento_int>16</vento_int> <intensidade>>10000</intensidade> </metar> <capitais>

Não consigo manipular tags e nem consegui entender a referência das tags, estou utilizando o XStream para consumir. Criei um classe “metar”, e coloquei todos os respectivos atributos: “código”, “atualização”, etc, entretanto sempre dá erro nesse “capitais” por fora. Ou ele não reconhece que eu passei o “metar” no alias. Segue código das classes abaixo.

public class LeitorXML {
	
	public List<Metar> carrega(InputStream fonte) {
		XStream stream = new XStream(new DomDriver());
		stream.alias("metar", Metar.class);
	
		return (List<Metar>) stream.fromXML(fonte);
	}
}

Classe Metar:

public class Metar {
	private final String codigo;
	private final String atualizacao;
	private final int pressao;
	private final int temperatura;
	private final String tempo;
	private final String tempo_desc;
	private final int umidade;
	private final int vento_dir;
	private final int vento_int;
	private final String intensidade;
	
	public Metar(String codigo, String atualizacao, int pressao, int temperatura, String tempo, String tempo_desc,
			int umidade, int vento_dir, int vento_int, String intensidade) {
		this.codigo = codigo;
		this.atualizacao = atualizacao;
		String dateFormat = "dd/mm/yyyy HH:mm:ss";
		dateFormat.format(atualizacao);
		this.pressao = pressao;
		this.temperatura = temperatura;
		this.tempo = tempo;
		this.tempo_desc = tempo_desc;
		this.umidade = umidade;
		this.vento_dir = vento_dir;
		this.vento_int = vento_int;
		this.intensidade = intensidade;
	}

	public String getCodigo() {
		return codigo;
	}

	public String getAtualizacao() {
		return atualizacao;
	}

	public int getPressao() {
		return pressao;
	}

	public int getTemperatura() {
		return temperatura;
	}

	public String getTempo() {
		return tempo;
	}

	public String getTempo_desc() {
		return tempo_desc;
	}

	public int getUmidade() {
		return umidade;
	}

	public int getVento_dir() {
		return vento_dir;
	}

	public int getVento_int() {
		return vento_int;
	}

	public String getIntensidade() {
		return intensidade;
	}
	
	
}

Classe ClientWebService:

public class ClientWebService {
	private static final String URL_WEBSERVICE = "http://servicos.cptec.inpe.br/XML/capitais/condicoesAtuais.xml";
	
	public List<Metar> getMetar() throws IOException {
		HttpURLConnection connection = null;
		
		try {
			URL url = new URL(URL_WEBSERVICE);
			
			connection = (HttpURLConnection) url.openConnection();
			
		    InputStream content = connection.getInputStream();
		    
		    return new LeitorXML().carrega(content);
		    
		} catch (MalformedURLException e) {
			throw new RuntimeException(e);
		} finally {
			connection.disconnect();
		}
	}
}

Pesquisando em alguns fóruns notei que criaram uma classe para a tag de fora, no meu caso seria capitais, com isso criei uma classe também: (Obs: Já tentei passar ela no alias e não deu certo)

public class Capitais {
	private List<Metar> capitais;
	
	public Capitais() {
		capitais = new ArrayList<>();
	}
	
	public List<Metar> getCapitais() {
		return capitais;
	}
	
}

Tentativa de rodar isso no main:

public class Main {
	
	public static void main(String[] args) {
		ClientWebService client = new ClientWebService();
		
		try {			
			/*List<Negociacao> negocio = client.getNegociacoes();
			for (Negociacao novoArray : negocio) {
				System.out.println(novoArray.getPreco());
			} */
			
			List<Metar> metar = client.getMetar();
			
			for(Metar novoArray : metar) {
				System.out.println(novoArray.getTemperatura());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

Erro disparado:

Exception in thread "main" com.thoughtworks.xstream.mapper.CannotResolveClassException: capitais
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45)
	at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1058)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1042)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:922)
	at com.model.LeitorXML.carrega(LeitorXML.java:24)
	at com.model.ClientWebService.getMetar(ClientWebService.java:24)
	at com.view.Main.main(Main.java:21)

Me perdoem, sei que ficou grande, mas tenho muito desejo em aprender isso, se alguém tiver a paciência em me explicar direitinho trilhando o caminho das pedras eu serei muito grato. Mesmo assim, agradeço desde já.

Primeiro isso não é um web service soap aqui e nem na china, vc sabe o conceito de soap, envelope e etc ?
Isso é um Objeto > capitais
Isso é um List > metar, atributos da lista > codigo, atualizacao e etc.
Dicas, como você está utilizando o xstream, crie a estrutura do seu objeto e faça um toXml e comparece o que o seu gerou com o que vc quer consumir, quando bater, vc faz o fromXml

Mais exemplos de rest.
http://developers.agenciaideias.com.br/correios/frete/json/05311900/20930390/0.300/200.00
http://developers.agenciaideias.com.br/tempo/json/são%20paulo-SP
http://developers.agenciaideias.com.br/cotacoes/json
http://developers.agenciaideias.com.br/horoscopo/xml

1 curtida

Veja que essa API do INPE tem uma tag com quebra de linha. Outra coisa, o Agencia de Idéias que lhe respondeu também não está no AR.

Recomendo http://webservice.seriesanalysis.com/moment/linhares_es

Basta trocar a cidade, tem que tirar acentos e espaço. Exemplos:
saopaulo_sp
riodejaneiro_rj
linhares_es
vitoria_es