Rest com Jersey Post (duvida)

9 respostas
P

Gostaria de uma dica de como eu passo um objeto para um serviço do tipo Post?
eu estou fazendo assim porem me parece que a solicitação nem esta localizando o serviço.

Mensagem de erro que aparece no teste. com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/estacionaraquisrv/rest/ufsrv/add returned a response status of 404 Not Found at com.sun.jersey.api.client.WebResource.handle(WebResource.java:676) at com.sun.jersey.api.client.WebResource.post(WebResource.java:251) at br.com.estacionaraqui.servicos.cliente.UfServicosCliente.adicionarUf(UfServicosCliente.java:54) at br.com.estacionaraqui.servicos.cliente.Teste2.executar(Teste2.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) ---Objeto que desejo enviar para o Serviço (item)----
UfServicosCliente ufCliente = new UfServicosCliente();
       
        Uf item = new Uf();
        item.setNome("Tocantins");
        item.setSigla("TO");
  
        ufCliente.adicionarUf(item);
------------------------------------------------------------------------------ ---Consumindo o serviço---
public class UfServicosCliente {
    private Configuracao config = Configuracao.getInstance();

    private ClientConfig configClt = new DefaultClientConfig();
    private Client cliente = Client.create(configClt);
    private WebResource recurso = cliente.resource(UriBuilder.fromUri(
            config.getUrlServidor()).build());

    public UfServicosCliente() {
        super();
    }

public void adicionarUf(Uf item) {
        System.out.println("passou aqui 1");
        recurso.path("rest").path("ufsrv").path("add").post(Uf.class, item);

    }
}
-------------------------------------------------------------------------------------- ----Serviço Adicionar UF----
@Path("/ufsrv")
public class UfServicos {

@POST
    @Path("/add/{item}")
    public void adicionaUf(@PathParam("item") Uf item) {
        System.out.println("Foi===>>>>>>>>>>>");
        UfDAO ufDao = SpringUtil.getFactory().getBean("ufDAO", UfDAO.class);
       
        ufDao.merge(item);

    }
}

9 Respostas

A

Me parece que falta definir quais os media types serão trafegados (XML ou JSON e assim por diante). Também falta colocar a classe Uf aqui para que a gente veja se está anotada corretamente. Ah, uma dica: uma URL assim @Path("/add/{item}") não é REST, é RPC. Se você quiser usar REST corretamente, só o fato de responder a POST já indica que o recurso está sendo adicionado, você não deve colocar isso na URL.

[]'s

P

Ola segue a classe UF
eu coloquei o /add para diferenciar um serviço do outro pois terei dois serviços do tipo POST vi em um outro forum que deve ser feito assim mais alterei e tambem não funcionou.

Eu tenho muito pouco conhecimento de programação o que sei é o pouco que passaram na faculdade.

package br.com.estacionaraquisrv.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@NamedQueries({
		@NamedQuery(name = "Uf.bySigla", query = "from Uf u where u.sigla = :sigla"),
		@NamedQuery(name = "Uf.byNome", query = "from Uf u order by u.nome") })
@XmlRootElement
public class Uf implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(insertable = false)
	@SequenceGenerator(name = "Uf_seq", sequenceName = "Uf_seq", initialValue = 1, allocationSize = 1)
	@GeneratedValue(generator = "Uf_seq", strategy = GenerationType.SEQUENCE)
	private Integer id;

	@Column(length = 2, nullable = false, unique = true)
	private String sigla;

	@Column(length = 50, nullable = false)
	private String nome;

	public Uf() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getSigla() {
		return sigla;
	}

	public void setSigla(String sigla) {
		this.sigla = sigla;
	}

	public String getNome() {
		return nome;
	}

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

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + ((sigla == null) ? 0 : sigla.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Uf other = (Uf) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (sigla == null) {
			if (other.sigla != null)
				return false;
		} else if (!sigla.equals(other.sigla))
			return false;
		return true;
	}

}
P

asaudate:
Me parece que falta definir quais os media types serão trafegados (XML ou JSON e assim por diante). Também falta colocar a classe Uf aqui para que a gente veja se está anotada corretamente. Ah, uma dica: uma URL assim @Path("/add/{item}") não é REST, é RPC. Se você quiser usar REST corretamente, só o fato de responder a POST já indica que o recurso está sendo adicionado, você não deve colocar isso na URL.

[]'s

Respondi sem citar, você recebe a informação mesmo assim?

A

perbony:
asaudate:
Me parece que falta definir quais os media types serão trafegados (XML ou JSON e assim por diante). Também falta colocar a classe Uf aqui para que a gente veja se está anotada corretamente. Ah, uma dica: uma URL assim @Path("/add/{item}") não é REST, é RPC. Se você quiser usar REST corretamente, só o fato de responder a POST já indica que o recurso está sendo adicionado, você não deve colocar isso na URL.

[]'s

Respondi sem citar, você recebe a informação mesmo assim?

Recebo sim.

Então, me parece que só falta colocar @Consumes (não é necessário colocar @Produces já que você não produz dados, de fato). Outra coisa, me parece que a URL que você está tentando acessar está errada, mesmo. A URL é essa: http://localhost:8080/estacionaraquisrv/rest/ufsrv/add . De onde veio o “rest” ?

[]'s

P
asaudate:
perbony:
asaudate:
Me parece que falta definir quais os media types serão trafegados (XML ou JSON e assim por diante). Também falta colocar a classe Uf aqui para que a gente veja se está anotada corretamente. Ah, uma dica: uma URL assim @Path("/add/{item}") não é REST, é RPC. Se você quiser usar REST corretamente, só o fato de responder a POST já indica que o recurso está sendo adicionado, você não deve colocar isso na URL.

[]'s

Respondi sem citar, você recebe a informação mesmo assim?

Recebo sim.

Então, me parece que só falta colocar @Consumes (não é necessário colocar @Produces já que você não produz dados, de fato). Outra coisa, me parece que a URL que você está tentando acessar está errada, mesmo. A URL é essa: http://localhost:8080/estacionaraquisrv/rest/ufsrv/add . De onde veio o "rest" ?

[]'s

Ola o rest vem do arquivo de configuração web.xml
<servlet-mapping>
		<servlet-name>Jersey REST Service</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>

Fiz as alterações que você me falou, as classes ficaram assim.

public void adicionarUf(Uf item) {
		System.out.println("passou aqui 1");
		recurso.path("rest").path("ufsrv").accept(MediaType.TEXT_XML)
				.post(Uf.class, item);

	}
@POST
	@Consumes(MediaType.TEXT_XML)
	public void adicionaUf(@PathParam("item") Uf item) {
		System.out.println("Foi===>>>>>>>>>>>");
		UfDAO ufDao = SpringUtil.getFactory().getBean("ufDAO", UfDAO.class);

		ufDao.merge(item);
	}

A mensagem de erro mudou para: com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/estacionaraquisrv/rest/ufsrv returned a response status of 415 Unsupported Media Type

O que eu não entendo é quem nem exibe essa mensagem "Foi===>>>>".
O procedimento de apagar e buscar dados no banco de dados consigo fazer normalmente.

A

É porque você tem que ajustar, também, o media type no seu client. Por isso ele começou a dar a mensagem. QUanto ao /rest, tente trocar por /* no web.xml e veja o que acontece…

[]'s

P

asaudate:
É porque você tem que ajustar, também, o media type no seu client. Por isso ele começou a dar a mensagem. QUanto ao /rest, tente trocar por /* no web.xml e veja o que acontece…

[]'s

Ola, amigo agradeço por todos as dicas que me passou porem não funcionou, testei com todos tipos de mediaType que existe e não deu certo. Com relação ao trocar o /rest pr /* ficou mais legal pois eliminei mais um path no codigo.

Existe alguma forma de descobrir o que pode estar causando esse problema?

P

asaudate:
É porque você tem que ajustar, também, o media type no seu client. Por isso ele começou a dar a mensagem. QUanto ao /rest, tente trocar por /* no web.xml e veja o que acontece…

[]'s

Amigo consegui chamar o Serviço, eu não expecifiquei o tipo de media Type, pois ai ele aceita qualquer tipo de media, porem agora deu um erro acho que no tomcat.

Foi===>>>>>>>>>>>

07/12/2011 15:23:47 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException

SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container

java.lang.IllegalArgumentException: attempt to create merge event with null entity

at org.hibernate.event.MergeEvent.(MergeEvent.java:60)

at org.hibernate.event.MergeEvent.(MergeEvent.java:43)

at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:843)

at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:847)

at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:682)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
P

Ola, consegui resolver o problema, venho aqui deixar a solução.

--Consumindo o Serviço----
public Uf adicionarUf(Uf item) {
		return recurso.path("rest").path("ufsrv").post(Uf.class, item);
	}
---Serviço UF----
@POST
	public Uf adicionaUf(Uf item) {
		UfDAO ufDao = SpringUtil.getFactory().getBean("ufDAO", UfDAO.class);

		return ufDao.merge(item);
	}

Obs.: Como faço para colocar como resolvido?

Criado 7 de dezembro de 2011
Ultima resposta 9 de dez. de 2011
Respostas 9
Participantes 2