Buenas a todos, estoy intentando realizar una web a modo de prueba que mi objetivo únicamente es que me llegue a mostrar los datos de la base de datos mysql en una aplicación web java , y que la salida de esta consulta se produzca en formato JSON. Es decir que poniendo la url en mi caso localhost/entrenadoresweb/rest/principal/ me muestre los datos de la consulta en formato JSON
Para ello he hecho lo siguiente:
* Instalado XAMP con el que tengo tomcat, apache y mysql
* Agregado el driver conector de mysql: mysql-connector-java-5.0.8-bin.jar a la carpeta LIB de TOMCAT y posteriormente agregado con ECLIPSE al proyecto pulsando en propiedades add external jar.
* He agregado la librería jersey-bundle-1.18.jar a tomcat y proyecto.
* He agregado la librería asm-3.3.1.jar a tomcat y proyecto.
* He agregado la librería asm-3.3.1.jar a tomcat y proyecto.
He creado las siguientes clases .java:
package dao;
import java.sql.*;
/**
* Clase que permite conectar con la base de datos
* @author Jose Carlos
*
*/
public class DbConnection {
/**Parametros de conexion*/
static String bd = "entrenadoresweb";
static String login = "root";
static String password = "";
static String url = "jdbc:mysql://localhost/"+bd;
Connection connection = null;
/** Constructor de DbConnection */
public DbConnection() {
try{
//obtenemos el driver de para mysql
Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexión
connection = DriverManager.getConnection(url,login,password);
if (connection!=null){
System.out.println("Conexión a base de datos "+bd+" OK\n");
System.out.println("Conexión"+connection+"\n");
}
}
catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}
/**Permite retornar la conexión*/
public Connection getConnection(){
return connection;
}
public void desconectar(){
connection = null;
}
}
He creado esta otra clase java:
package dao;
import java.sql.PreparedStatement;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import dao.DbConnection;
import model.User;
public class JDBCUserDAOImpl implements UserDAO{
public void registrarPersona(User user)
{
DbConnection conex= new DbConnection();
try {
Statement estatuto = conex.getConnection().createStatement();
estatuto.executeUpdate("INSERT INTO user VALUES ('"+user.getId()+"', '"
+user.getUsername()+"', '"+user.getPassword()+"', '"
+user.getEmail()+"', '"+user.getUploads()+"')");
JOptionPane.showMessageDialog(null, "Se ha registrado Exitosamente","Información",JOptionPane.INFORMATIO N_MESSAGE);
estatuto.close();
conex.desconectar();
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Registro el usuario");
}
}
public ArrayList<User> listaDeUsuarios() {
final Logger logger = Logger.getLogger(JDBCUserDAOImpl.class.getName());
ArrayList<User> miUsuario = new ArrayList<User>();
DbConnection conex= new DbConnection();
System.out.println("COMPRUEBO SI DETECTA CONEXIÓN "+conex.getConnection()+" OK\n");
try {
PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM user");
ResultSet res = consulta.executeQuery();
while(res.next()){
User usuario= new User();
usuario.setId(Integer.parseInt(res.getString("id") ));
usuario.setUsername(res.getString("username"));
usuario.setPassword(res.getString("password"));
usuario.setRango(res.getString("range"));
usuario.setUploads(Integer.parseInt(res.getString( "uploads")));
usuario.setDownloads(Integer.parseInt(res.getStrin g("downloads")));
usuario.setInvitations(Integer.parseInt(res.getStr ing("edad")));
miUsuario.add(usuario);
}
res.close();
consulta.close();
conex.desconectar();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "no se pudo consultar el usuario\n"+e);
}
return miUsuario;
}
}
He creado este otro java:
package dao;
import model.User;
import java.util.ArrayList;
public interface UserDAO {
public ArrayList<User> listaDeUsuarios();
public void registrarPersona(User user);
}
He creado el User.java
package model;
public class User {
private long id;
private String username;
private String password;
private String email;
private int uploads;
private int downloads;
private String rango;
private int invitations;
private String datereg;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getUploads() {
return uploads;
}
public void setUploads(int uploads) {
this.uploads = uploads;
}
public int getDownloads() {
return downloads;
}
public void setDownloads(int downloads) {
this.downloads = downloads;
}
public String getRango() {
return rango;
}
public void setRango(String rango) {
this.rango = rango;
}
public int getInvitations() {
return invitations;
}
public void setInvitations(int invitations) {
this.invitations = invitations;
}
public String getDatereg() {
return datereg;
}
public void setDatereg(String datereg) {
this.datereg = datereg;
}
}
Y por último en resources:
package resources;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
//import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
//import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import dao.JDBCUserDAOImpl;
import dao.UserDAO;
import model.User;
@Path("/principal")
public class UserResource {
@Context
ServletContext sc;
@Context
UriInfo uriInfo;
@Context
HttpServletRequest request;
@GET
@Produces(MediaType.APPLICATION_JSON) //
public List<User> getUsersJSON() {
UserDAO userDao = new JDBCUserDAOImpl();
List<User> users = userDao.listaDeUsuarios();
//List<Board> boards = boardDao.getAllByUser((Long) request.getSession().getAttribute("user"));
return users;
}
}
La consola me da el siguiente error al poner la dirección que comenté al principio:
Conexión a base de datos entrenadoresweb OK
Conexióncom.mysql.jdbc.Connection@cc1d919
COMPRUEBO SI DETECTA CONEXIÓN com.mysql.jdbc.Connection@cc1d919 OK
jun 30, 2014 6:58:57 PM com.sun.jersey.spi.container.ContainerResponse write
Grave: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<model.User>, and MIME media type application/json was not found.
The registered message body writers compatible with the MIME media type are:
application/json ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBE lementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootE lementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListE lementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvi der
com.sun.jersey.core.impl.provider.entity.StringPro vider
com.sun.jersey.core.impl.provider.entity.ByteArray Provider
com.sun.jersey.core.impl.provider.entity.FileProvi der
.................(he quitado algunos no caben en el post)
jun 30, 2014 6:58:57 PM com.sun.jersey.spi.container.ContainerResponse logException
Grave: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<model.User>, and MIME media type application/json was not found.
at com.sun.jersey.spi.container.ContainerResponse.wri te(ContainerResponse.java:284)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl._handleRequest(WebApplicationImpl.java:151 0)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:1419 )
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:1409 )
at com.sun.jersey.spi.container.servlet.WebComponent. service(WebComponent.java:409)
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<model.User>, and MIME media type application/json was not found.
... 24 more
¿A qué puede ser debido?