[RESOLVIDO] Como pegar uma lista usando o método GET e Vraptor?

6 respostas
bland

Olá pessoal,

Eu estou tentando recuperar uma lista de itens de um determinado objeto, mas sempre dá erro no parse do Xstream. Tentei diversas opções com base nesses arquivos de exemplo e mesmo assim, nada. Me senti confuso seguindo esses arquivos, pra falar a verdade.

Tenho a seguinte configuração:

@Component
public class CustomXStreamXMLDeserializer extends XStreamXMLDeserializer {

	public CustomXStreamXMLDeserializer( ParameterNameProvider provider ) {
		super( provider );
	}
	
	@Override  
	protected XStream getXStream() {
		XStream stream = super.getXStream();
		stream.processAnnotations( new Class[] { ServicoCobertoDto.class, ServicoItemCobrancaDto.class } );
		return stream;
	}
}
@XStreamAlias("servicoItemCobranca")
public class ServicoItemCobrancaDto {
	
	private List<ServicoCobertoDto> servicoCoberto;

	public List<ServicoCobertoDto> getServicoCoberto() {
		return servicoCoberto;
	}

	public void setServicoCoberto(List<ServicoCobertoDto> servicoCoberto) {
		this.servicoCoberto = servicoCoberto;
	}
}
@XStreamAlias("servicoCoberto")
public class ServicoCobertoDto {

	private Long idServico;

	public Long getIdServico() {
		return idServico;
	}

	public void setIdServico(Long idServico) {
		this.idServico = idServico;
	}
}

E o controlador:

@Resource
public class GerirServicoController {

	private Result result;

	public GerirServicoController( Result result ) {
		this.result = result;
	}
	
	@Get
	@Path( "/servicosCobertos/{id}" )
	public void servicosCobertos( Long id ) {
		
		try {
			
			if ( id != null ) {
				
				// Processamento ...
				result.use( Results.representation() ).from( servicoItemCobrancaDto.getServicoCoberto(), "servicos" ).serialize();
				
			} else {
				throw new IllegalArgumentException( "Exception text" );
			}
				
		} catch( Exception ex ) {
			result.use( Results.status() ).badRequest( ex.getMessage() );
		}
	}
}

E então eu tenho a classe de teste…

public class ServicoItemCobrancaTest {

	private static final String XML = "application/xml";
	private RestClient restfulie;

	@Before
	public void setUp() throws Exception {
		restfulie = Restfulie.custom();
		restfulie.getMediaTypes().register( new XmlMediaType().withTypes( ServicoItemCobrancaDto.class, ServicoCobertoDto.class ) );
	}

	@Test
	public void shouldBeAbleToNavigateThroughLinks() throws Exception {
		Response response = restfulie.at("http://localhost:8080/genhio/servicosCobertos/1").accept( XML ).get();
		List<ServicoCobertoDto> servicos = response.getResource();
		// ...
	}
}

Só que no ponto que eu tento pegar o resource (response.getResource()) está dando o seguinte erro:

Como poderia resolver esse problema? Alguém tem alguma sugestão?

De antemão, obrigado.

6 Respostas

Lucas_Cavalcanti

o problema é que o XStream talvez não saiba funcionar bem quando o elemento raiz é uma lista…

se você criar a uma classe no cliente:

@XStreamAlias("servicos")
class Servicos {
    private List<ServicoCobertoDto> servicoCobertoDto;  
  
    public List<ServicoCobertoDto> getServicoCobertoDto() {  
        return servicoCoberto;  
    }  
  
    public void setServicoCobertoDto(List<ServicoCobertoDto> servicoCoberto) {  
        this.servicoCoberto = servicoCoberto;  
    }  
}

e adicionar elas no xmlTypes deve funcionar…

bland

Olá Lucas, tudo bem?

Obrigado de antemão.

Fiz o que você recomendou e passou a dar outro erro:

Criei a classe Servicos e adicionei aos testes:

@Before
	public void setUp() throws Exception {
		restfulie = Restfulie.custom();
		restfulie.getMediaTypes().register( new XmlMediaType().withTypes( ServicoCobertoDto.class, Servicos.class ) );
	}

Tentei seguir a sua lógica (criar um novo objeto com o nome Servicos) para tentar resolver esse erro e não consegui.
Sabe dizer o que estou fazendo de errado?

Obrigado.

Lucas_Cavalcanti

como está sendo gerado o xml? posta aqui um exemplo por favor.

bland

Lucas,

Segue um exemplo do arquivo de retorno.

&lt;servicos&gt;
  &lt;servicoCobertoDto&gt;
    &lt;idServico&gt;2296&lt;/idServico&gt;
  &lt;/servicoCobertoDto&gt;
  &lt;servicoCobertoDto&gt;
    &lt;idServico&gt;2133&lt;/idServico&gt;
  &lt;/servicoCobertoDto&gt;
  &lt;servicoCobertoDto&gt;
    &lt;idServico&gt;666&lt;/idServico&gt;
  &lt;/servicoCobertoDto&gt;
  ...
&lt;/servicos&gt;

Pelo erro apresentado e a maneira como o XML está sendo gerado, penso que o erro está na geração do arquivo. Ou seja, ele deveria estar informando que o servicoCobertoDto faz parte de uma lista.

Será que o erro estaria aqui?

result.use( Results.representation() ).from( servicoItemCobrancaDto.getServicoCoberto(), "servicos" ).serialize();
Lucas_Cavalcanti

Tenta o seguinte, na classe Servicos:

@XStreamAlias("servicos")  
class Servicos {  
   @XStreamImplicit
    private List<ServicoCobertoDto> servicoCobertoDto;
...
bland

Lucas,

Funcionou! A sua sugestão de mudança deu certo, porém eu precisei mudar isso nos meus testes:

Ou seja, ao invés de retornar uma lista de ServicosCobertosDto, ele retorna um objeto Servicos com a lista dentro.

Muito obrigado pela sua ajuda.

Abraço!

Criado 20 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 6
Participantes 2