JAX-RS como varios parametros

9 respostas
D

Pessoal, estou com uma dúvida que preciso implementar em um serviço.

Estou utilizando o JAX-RS/Jersey para implementação de serviços.
E preciso passar para o serviço uma lista de ids.
Para evitar chamar N vezes o serviço (requests) quero passar uma lista.
Como posso fazer.

Como estou usando hoje:
http://localhost/servico/{id}

Com isso se forem 100 ids tenho q chamar 100 vezes isso.

Porem quero fazer algo como:
http://localhost/servico/{id...}
Exemplo:
http://localhost/servico/1/2/3
Desse modo, o que vem depois de serviço seria um unico parametro em lista.

Não sei se é possivel, ou tenho que fazer um pog para isso?

9 Respostas

I

passa um xml com todos os ids.
muda seu consumes pra receber o xml e faz uma classe que representa a coleção dos ids que vc vai mandar

@consumes(“application/xml”)
public void recebeIds(ListaIds lista)

e na classe que representa a lista de ids:

@XmlRootElement(name=“lista”)
ListaIds{

List ids = … ArrayList

@XmlElement(name=“id”)
getListaIds()

}

D

Ficou uma dúvida, como enviar o xml? :oops:
Como um arquivo? ou existe outra forma?

Estou fazendo o teste assim

WebClient client = WebClient.create("http://127.0.0.1:8080/servico/");

Caso tenho algum parametro que possa utilizar usando isso.

I

vc vai ter que enviar via http post

D

Devo ta fazendo algo errado....

@POST
	@Path("/manyids")
	@Consumes(MediaType.APPLICATION_XML)
	public Response testeIds(@FormDataParam("ids") ListaIds ids) {

		for (Integer id : ids.getIds())
			System.out.println(id);

		return Response.status(200).entity("Olha o console pow!!!!").build();

	}

	@XmlRootElement(name = "lista")
	public static class ListaIds {
		@XmlElement(name = "id")
		@Getter
		@Setter
		private List<Integer> ids = new ArrayList<>();
	}

...
Grave: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Missing dependency for method public void teste.testeIds(teste.MarcadorService$ListaIds) at parameter at index 0 SEVERE: Method, public void teste.MarcadorService.testeIds(teste.MarcadorService$ListaIds), annotated with POST of resource, class teste.MarcadorService, is not recognized as valid resource method. Mar 09, 2012 3:30:45 PM com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate Grave: Exception occurred when intialization com.sun.jersey.spi.inject.Errors$ErrorMessagesException at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771) at com.sun.jersey.spi.spring.container.servlet.SpringServlet.initiate(SpringServlet.java:117) at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318) at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609) at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373) at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556) at javax.servlet.GenericServlet.init(GenericServlet.java:160) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5001) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3894) at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1310) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1496) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1506) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1506) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1485) at java.lang.Thread.run(Thread.java:722)

Esse erro acontece quando inicio o tomcat para levantar a aplicação.

I

vc nao deve associar a lista de ids ao @FormDataParam(“ids”).

fica apenas
public Response testeIds(ListaIds ids) {

e na classe da lista
a anotação vai sobre a get do objeto e nao na declaração.

D
try {
			String file = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><lista><ids><id>1</id><id>2</id></ids></lista>";
			FormDataMultiPart form = new FormDataMultiPart().field("ids", file, MediaType.MULTIPART_FORM_DATA_TYPE);

			ClientConfig cc = new DefaultClientConfig();
			cc.getClasses().add(MultiPartWriter.class);

			WebResource webResource = Client.create(cc).resource(url);
			webResource.type(MediaType.MULTIPART_FORM_DATA).post(form);

		} catch (Exception e) {
			e.printStackTrace();
		}

Esse é meu codigo de envio, seria isso mesmo?

I

vc realmente tem a necessidade que seja MediaType.MULTIPART_FORM
?

D

Não, porem como eu enviaria dessa forma?

I

vcp ode usar por exemplo o apache http client.
mandar via post o string do xml da lista…

Criado 9 de março de 2012
Ultima resposta 9 de mar. de 2012
Respostas 9
Participantes 2