RESTful Json java

7 respostas
java
V

Galera blz?
Será que alguém poderia dar uma força, estou aprendendo sobre WebService, e está retornando o seguinte erro: do GlassFish

MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList.

segue abaixo minhas classes, estou usando Jersey 1.17

WebService:

package br.com.ophos.services;

import br.com.ophos.dao.ClienteDAO;
import br.com.ophos.dao.DAOException;
import br.com.ophos.dao.DAOFactory;
import br.com.ophos.mobile.model.Cliente;
import java.util.List;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PUT;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

/**
 * REST Web Service
 *
 * @author Victor Oliveira
 */
@Path("cliente")
public class WebService {

    @Context
    private UriInfo context;
    private ClienteDAO dao = DAOFactory.getClienteDAO();

    public WebService() {
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getJson() {
        //TODO return proper representation object
        throw new UnsupportedOperationException();
    }

    @Path("list")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response list() {
        try {
            List<Cliente> cliente = (List<Cliente>) dao.list();
            if (cliente == null || cliente.isEmpty()) {
                return Response.status(Response.Status.NOT_FOUND).build();
            }
            return Response.ok(cliente).build();
        } catch (Exception e) {
            return Response.serverError().build();
        }
    }

    @GET
    @Path("/find/{Id}")
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.APPLICATION_JSON)
    public Response Find(@PathParam("Id") Long Id) {
        try {
            Cliente obj = dao.find(Id);
            if (obj == null) {
                return Response.status(Response.Status.NOT_FOUND).build();
            }
            return Response.ok(obj).build();
        } catch (Exception e) {
            return Response.serverError().build();
        }
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public Response Create(Cliente obj) {
        try {
            obj.setId(obj.getId());
            obj.setNome(obj.getNome());
            dao.create(obj);
            return Response.status(Response.Status.OK).build();
        } catch (DAOException ex) {
            return Response.serverError().build();
        }
    }

    @POST
    @Path("/update/{id}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public Response Update(Cliente obj, @PathParam("id") long id) {
        try {
            dao.update(obj);
            return Response.status(Response.Status.OK).build();
        } catch (DAOException ex) {
            return Response.serverError().build();
        }
    }

    @Path("/delete/{id}")
    @DELETE
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public Response Delete(@PathParam("id") Long id) {
        try {
            dao.delete(id);
            return Response.status(Response.Status.OK).build();
        } catch (DAOException ex) {
            return Response.serverError().build();
        }
    }

    /**
     * PUT method for updating or creating an instance of WebService
     *
     * @param content representation for the resource
     */
    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public void putJson(String content) {
    }
}


Classe DAO:

package br.com.ophos.dao.impl;
import br.com.ophos.dao.ClienteDAO;
import br.com.ophos.dao.DAOException;
import br.com.ophos.mobile.model.Cliente;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Victor Oliveira
 */
public class ClienteDAOImpl implements ClienteDAO {

    private Connection conn;

    private void open() throws ClassNotFoundException, SQLException {
        Class.forName("oracle.jdbc.OracleDriver");
        String dbURL = "jdbc:oracle:thin:@localhost:1521:XE";
        String username = "System";
        String password = "194!@#";
        conn = DriverManager.getConnection(dbURL, username, password);

    }

    private void close() {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    @Override
    public Collection<Cliente> list() throws DAOException {
        List<Cliente> lista = new ArrayList<>();
        try {
            open();
            try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM CLIENTE");
                    ResultSet rs = stmt.executeQuery()) {
                while (rs.next()) {
                    // criando o objeto Contato
                    Cliente cliente = new Cliente();
                    cliente.setId(rs.getLong("ID"));
                    cliente.setNome(rs.getString("NOME"));
                    lista.add(cliente);
                }
            }
            return lista;
        } catch (SQLException | ClassNotFoundException e) {
            throw new DAOException("Ocorreu um erro ao consultar os clientes. Erro: " + e.getMessage());
        } finally {
            close();
        }
    }

    @Override
    public Cliente find(Long id) throws DAOException {
        try {
            open();
            try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM CLIENTE WHERE ID = ?")) {
                stmt.setLong(1, id.longValue());
                ResultSet rs = stmt.executeQuery();

                while (rs.next()) {
                    // criando o objeto Contato
                    Cliente cliente = new Cliente();
                    cliente.setId(rs.getLong("ID"));
                    cliente.setNome(rs.getString("NOME"));
                    return cliente;
                }
                return null;
            }
        } catch (ClassNotFoundException | SQLException ex) {
            throw new DAOException("Ocorreu um erro ao consultar o cliente. Erro: " + ex.getMessage());
        } finally {
            close();
        }
    }

    @Override
    public void create(Cliente obj) throws DAOException {
        try {
            // autoincremento
            
            open();
            PreparedStatement stat;
            String SQLInsert = "INSERT INTO CLIENTE (ID, NOME) VALUES (?, ?)";
            stat = conn.prepareStatement(SQLInsert);
            stat.setLong(1, obj.getId());
            stat.setString(2, obj.getNome());
            stat.executeUpdate();
        } catch (SQLException | ClassNotFoundException ex) {
            throw new DAOException("Ocorreu um erro ao criar o cliente. Erro: " + ex.getMessage());
        } finally {
            close();
        }
    }

    @Override
    public void update(Cliente obj) throws DAOException {
        try {
            open();
            PreparedStatement stat;
            String SQLUpdate = "UPDATE CLIENTE SET NOME = ? WHERE ID = ? ";
            stat = conn.prepareStatement(SQLUpdate);
            stat.setString(1, obj.getNome());
            stat.setLong(2, obj.getId());
            stat.execute();
            close();
        } catch (ClassNotFoundException | SQLException ex) {
            throw new DAOException("Ocorreu um erro ao atualizar o cliente. Erro: " + ex.getMessage());
        } finally {
            close();
        }
    }

    @Override
    public void delete(Long id) throws DAOException {
        try {
            open();
            PreparedStatement stat;
            String SQLDelete = "DELETE FROM CLIENTE WHERE ID = ?";
            stat = conn.prepareStatement(SQLDelete);
            stat.setLong(1, id);
            stat.execute();
        } catch (SQLException | ClassNotFoundException ex) {
            throw new DAOException("Ocorreu um erro ao apagar o cliente. Erro: " + ex.getMessage());
        } finally {
            close();
        }
    }
}

POJO:

package br.com.ophos.mobile.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Cliente {

    private Long id;
    
    private String nome;
    
    public Long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

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

}

Agradeço quem puder dar uma força.

7 Respostas

Daniel_Dias

Ola @Victor_Oliveira

veja esse essa solução ira ajuda-lo.

V

Obrigado Brother !

viniciosarodrigues

Tenta isso ó

@Path("list")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response list() {
        try {
            List<Cliente> cliente = (List<Cliente>) dao.list();
            if (cliente == null || cliente.isEmpty()) {
                return Response.status(Response.Status.NOT_FOUND).build();
            }
            return Response.ok().entity(new GenericEntity<List<Cliente>>(cliente) {
	}).build();
        } catch (Exception e) {
            return Response.serverError().build();
        }
    }
V

Tentei fazer os dois métodos, porém ao debugar ele cai na classe method.java, ai no método abaixo ele para de executar e retorna erro do GlassFish,

MethodAccessor ma = methodAccessor;             // read volatile
        if (ma == null) {
            ma = acquireMethodAccessor();
        }
        return ma.invoke(obj, args);
    } 

Advertência:   StandardWrapperValve[br.com.ophos.services.ApplicationConfig]: Servlet.service() for servlet br.com.ophos.services.ApplicationConfig threw exception
java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper
	at org.eclipse.persistence.jaxb.JAXBBeanValidator.isConstrainedObject(JAXBBeanValidator.java:257)
	at org.eclipse.persistence.jaxb.JAXBBeanValidator.shouldValidate(JAXBBeanValidator.java:208)
	at org.eclipse.persistence.jaxb.JAXBMarshaller.validateAndTransformIfNeeded(JAXBMarshaller.java:587)
	at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:481)
	at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:949)
	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
	at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
	at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86)
	at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
	at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130)
	at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:683)
	at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:424)
	at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:414)
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:312)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:292)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1139)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:460)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
	at java.lang.Thread.run(Thread.java:745)
viniciosarodrigues

Eu não tenho certeza, mas tenta serializar o bean…

package br.com.ophos.mobile.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Cliente implements Serializable

Lembrando de gerar o ID

viniciosarodrigues

Caso não funcione… Tenta isso: http://stackoverflow.com/questions/33722764/glassfish-error-when-producing-json

V

Ai sim fiz as alterações, troquei para GlassFish 4.0 e adicionei o jar org.eclipse.persistence.moxy.

Deu certo vlw.

Criado 31 de outubro de 2016
Ultima resposta 2 de nov. de 2016
Respostas 7
Participantes 3