Problema no WebService

14 respostas
java
Fabricio_Patrocinio

Estou com um problema aqui, o negocio é o seguinte da select no banco de dados, carrega a lista só que na hora de devolver da erro 500… não está dando nenhuma exceção nem nada, o hibernate da um select somente… se alguem souber como me ajudar…

Código do metodo http

@GET
@Path("/produtosporcategoria")
@Produces(MediaType.APPLICATION_JSON)
public List<Produto> listarProdutosPorCategoria(@QueryParam("id") int idTipo) {
	ProdutosDAO produtosDAO = new ProdutosDAO();
	return produtosDAO.listarProdutoPorTipo(idTipo);
}

codigo do DAO

public List<Produto> listarProdutoPorTipo(int idTipo) {
	EntityManager em = JPAUtil.getEntityManager();
	Query query = em.createQuery("Select p from Produto p where p.idTipoProduto.id = :idTipo");
	query.setParameter("idTipo", idTipo);
	List<Produto> produtos = query.getResultList();
	em.close();
	return produtos;
}

Classe Produto…

@Entity
@Table(schema="produtos", name="\"Produtos\"")
public class Produto {

@SequenceGenerator(name="produtosGen",
					sequenceName="PRODUTOS_SEQ",
					allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="produtosGen")
@Column(name="\"Id\"")
private int id;

@Column(name="\"Descricao\"", nullable=false)
private String descricao;

@Column(name="\"PrecoVenda\"", nullable=false)
private Double precoVenda;

@Column(name="\"PrecoCusto\"", nullable=false)
private Double precoCusto;

@ManyToOne(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name="\"IdTipoProduto\"", nullable=false)
private TipoProduto idTipoProduto;

@ManyToOne(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name="\"IdSetorProduto\"", nullable=false)
private SetorProduto idSetorProduto;

@OneToMany(mappedBy="produtoMesa", targetEntity=MesaProduto.class, fetch = FetchType.LAZY)
private List<Produto> produtos;

 //getter e setters

}

E o persistence xml…

<persistence-unit name="Maisuma" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.connection.username" value="postgres"/> <property name="hibernate.connection.password" value="MASTERKEY"/> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/Restaurante2"/> <property name="hibernate.max_fetch_depth" value="5"/> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.use_sql_comments" value="false" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.jdbc.batch_size" value="50" /> <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file --> <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ --> </properties> </persistence-unit>

Acho que é só isso mesmo?

14 Respostas

javaflex

Erro 500 é só a resposta final do HTTP. Você vai ter que depurar até chegar pontualmente no problema da sua aplicação.

igomes

Da uma olhada no log do container, talvez tenha algo la, e uns break points, ve se o objeto ta sendo preenchido e etc.
E não retorna List nuuuuuunca, retorna um Response e trata pelo menos o mínimo dos códigos https, que aliás é uma das premissas de rest :slight_smile:

Fabricio_Patrocinio

ja depurei o codigo e ta tudo ok, não da erro nenhum, preenche os objetos certinho, só na hora de chegar o json ai da erro 500 mais mesmo assim por 1 id da certo já nos outros não da certo

pfk66

Deu erro em algum lugar no seu handler, é porque o servidor loga a exceção e a vida continua como se nada tivesse acontecido.

Fabricio_Patrocinio

Como assim handler?

Felipe_Miranda

Partindo da premissa que você falou que seu código está correto e consegue obter uma lista de produtos do DAO, retornando até sua interface REST, seu erro é como você está informando a resposta ao protocolo HTTP, ele não sabe oque é List, o protocolo não sabe interpretar isso, você deve informa-lo onde irá sua lista de produtos no HTTP! ex:

//Seu metodo deve retornar um Response e não uma lista de produtos
@GET
public Response listarProdutosPorCategoria(@QueryParam("id") int idTipo) {
          
           //Obtendo lista de produtos 
           ProdutosDAO produtosDAO = new ProdutosDAO();
           List<Produto> produtoList  = new ArrayList<Produto>();
	   produtoList  = produtosDAO.listarProdutoPorTipo(idTipo);

          //Preparando resposta para o HTTP
          return Response.status(Response.Status.OK) // Aqui você informa o status 200 ao protocolo
				.entity(produtoList).build();
}

Você poderia manipular o cabeçalho do http, para enviar mais informações, fora a lista que irá retornar, mas isso fica pra depois.

Conselho, deixe seu código menos acoplado possível, você está instanciando um DAO na interface de serviço REST, tente usar injeção de dependência e deixe isso transparente para interface, deixe támbem os parâmetros da QueryParam como final.

igomes

E lembrando vc usa os query param quando o parâmetro é opcional, para os obrigatórios existe o path.
Caso não chegue nenhum id, vc está tratando isso ?
E só complementando o comentário do @Felipe_Miranda que eu concordo plenamente, tanto que comentei isso lá em cima, acho que já existe um método ok no Response, ai vc não precisa passar explicitamente o status nesse caso.
E ainda vc poderia fazer mais uma verificação pra ver o objeto foi recuperado, caso contrário manda um 404.

Fabricio_Patrocinio

Pra retorna um Response ponhe o que no Produces? application/json fala que da nao corresponde com a resposta

igomes

O produces continua do mesmo jeito, se for um json no caso

Felipe_Miranda

Anota sua classe com isso:

@Path("/produtosporcategoria")
@Produces(MediaType.APPLICATION_JSON)

e deixa o metódo de produtos anotado somente com

@GET
Fabricio_Patrocinio

Nada funciona :frowning:

Felipe_Miranda

Onde acontece o problema? você deve ser mais claro, evidênciar os problemas para que possamos te ajudar, poste como esta seu código no front-end e a interface do seu serviço REST.

Fabricio_Patrocinio

Não tem interface é so isso o codigo é um webservice que vai mandar a lista para um sistema android, isso eu estou testando no proprio browser para ver a lista com o formato json…

igomes

oq vc ta usando para a serialização ?

Criado 13 de julho de 2016
Ultima resposta 27 de jul. de 2016
Respostas 14
Participantes 5