Foros del Web » Programación para mayores de 30 ;) » Java »

Problema conectando JAVA+MYSQL+JSON

Estas en el tema de Problema conectando JAVA+MYSQL+JSON en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 30/06/2014, 10:50
 
Fecha de Ingreso: septiembre-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 0
Problema conectando JAVA+MYSQL+JSON

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?

Última edición por elroket; 30/06/2014 a las 10:56 Razón: h
  #2 (permalink)  
Antiguo 02/07/2014, 18:05
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema conectando JAVA+MYSQL+JSON

Hola amigo,

Como estas ? lamentablemente es mi dia 2 en Java y tengo de hecho problemas para conectar con bases de datos (te voy a pedir ayuda) pero.... si vi algo que aunque no se relaciona con tu consulta debes mejorar.

Lo primero..... parece ser que te falta una "annotation" y por eso el error que ves.


Ahora lo que te decia..... que no esta muy bien que digamos aunque funcione:

Código Java:
Ver original
  1. import javax.swing.JOptionPane;
  2. ...
  3.  
  4. try {
  5. ...
  6. } catch (Exception e) {
  7.     JOptionPane.showMessageDialog(null, "no se pudo consultar el usuario\n"+e);
  8. }

Generalmente me ignoran cuando respondo algo que no va a la urgencia del tema pero me llamo la atencion importaras swing en una libreria de DB y luego vi ese JOptionPane en el catch() y debo decir que esta mal: ¿ Por que ?

No debes mezclar las vistas con los modelos (MVC), asi en todo caso lo que haces ahi es re-lanzar la excepcion con tu mensaje y la puedes capturar a otro nivel superior:

Código Java:
Ver original
  1. throw new Exception("no se pudo consultar el usuario\n"+e);


Como decia... re-lanzas la excepcion porque la capturas en otro momento y aca es cuando:

Código Java:
Ver original
  1. try {
  2.     UserDAO userDao = new JDBCUserDAOImpl()
  3. } catch (Exception e) {
  4.     JOptionPane.showMessageDialog(null, "No se pudo consultar el usuario\n"+e);
  5. }


Ahora ... mi pedido solidario

Que OS tienes ? version ? 32 / 64 bits ? que conector te has bajado ? que version de JRE tienes ? 7 ? 8 ?

Mil gracias!
__________________
Salu2!

Última edición por Italico76; 02/07/2014 a las 19:56
  #3 (permalink)  
Antiguo 04/07/2014, 17:40
 
Fecha de Ingreso: septiembre-2009
Mensajes: 39
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Problema conectando JAVA+MYSQL+JSON

Buenas, en primer lugar agradecerte la respuesta, el problema finalmente era que no había puesto en user.java la anotación @XmlRootElement() motivo por el que no funcionaba.

Respecto a la versión tengo 64 bits, y el conector es mysql-connector-java-5.0.8-bin.jar

un saludo
  #4 (permalink)  
Antiguo 04/07/2014, 17:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema conectando JAVA+MYSQL+JSON

Entonces ese enlace te sirvio...... me alegro mucho
__________________
Salu2!

Etiquetas: conectando, javascript, js, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:05.