Jump to content
Sign in to follow this  
knoker

Gerar Json/Xml com Jackson

Recommended Posts

knoker

Boas,

estou pela primeira vez a fazer um projecto em que uso Jackson para gerar XML e Json, mas estou com um problemas... exactamente o mesmo código quando no request peço json tudo bem gera isto

{"error":0,"data":
   {"userId":17,"username":"xxxx","password":"xxxx","email":"xxxx","permissions":1,"sessions":
   {"sessionId":8,"sessionKey":"b0880029fae3b4588c37640f8452b2da","creationStamp":2017052136},"country":{"countryId":177,"iso2":"PT","shortName":"Portugal","longName":"Portuguese Republic","iso3":"PRT","numcode":"620","unMember":"yes","callingCode":"351","cctld":".pt"}},
   "erroMessage":""}

mas quando não digo nada no cabeçalho ou peço xml ele lança esta excepção

Jan 27, 2013 12:02:55 AM com.sun.jersey.spi.container.ContainerResponse logException
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.]
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:159)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.]
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:179)
at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:157)
... 27 more
Caused by: com.sun.istack.internal.SAXException2: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:235)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:250)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:642)
at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:343)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:582)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:325)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:483)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
... 31 more
Caused by: javax.xml.bind.JAXBException: class pt.eoliveira.appmanager.dao.Users nor any of its super class is known to this context.
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:573)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:637)
... 37 more

estou a fazer o output através deste método

@GET
   @Path("validate")
   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
   public Message validate(@QueryParam("username") String username, @QueryParam("password") String password) throws NoSuchAlgorithmException {
    Users rtn = validateUser(username, password);
    if (rtn != null) {
	    if (rtn.getSessions() == null) {
		    rtn.setSessions(new Sessions(MySqlTools.MD5Encode(System.currentTimeMillis() + MySqlTools.SALT), (int) System.currentTimeMillis(), rtn));
		    super.edit(rtn);
	    }
	    return new Message(rtn);
    }
    return new Message(1,"Invalid Username or Password");
   }

a classe Message tem o seguinte código

package pt.eoliveira.appmanager.wrappers;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "message")
public class Message {
   private int error = 0;
   private String errorMessage = "";
   private Object data;
   public Message() {
   }
   public Message(int error, String errorMessage) {
    this.error = error;
    this.errorMessage = errorMessage;
   }
   public Message(Object data) {
    this.data = data;
   }
   public Message setData(Object data) {
    this.data = data;
    return this;
   }
   public Message setError(int error, String errorMessage) {
    this.error = error;
    this.errorMessage = errorMessage;
    return this;
   }
   public int getError() {
    return error;
   }
   public String getErroMessage() {
    return errorMessage;
   }
   public Object getData() {
    return data;
   }
}

e a classe Users o seguinte

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package pt.eoliveira.appmanager.dao;
import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.codehaus.jackson.annotate.JsonIgnore;
import pt.eoliveira.appmanager.utils.MySqlTools;
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
   @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
   @NamedQuery(name = "Users.findByUserId", query = "SELECT u FROM Users u WHERE u.userId = :userId"),
   @NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
   @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password"),
   @NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
   @NamedQuery(name = "Users.findByPermissions", query = "SELECT u FROM Users u WHERE u.permissions = :permissions")
})
public class Users implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Basic(optional = false)
   @Column(name = "user_id")
   private Integer userId;

   @Basic(optional = false)
   @Column(name = "username")
   private String username;

   @Basic(optional = false)
   @Column(name = "password")
   @XmlTransient
   @JsonIgnore
   private String password;

   @Basic(optional = false)
   @Column(name = "email")
   private String email;

   @Basic(optional = false)
   @Column(name = "permissions")
   private int permissions;

   @OneToOne(mappedBy = "owner")
   private Sessions sessions;

   @JoinColumn(name = "country", referencedColumnName = "country_id")
   @ManyToOne(optional = false)
   private Country country;

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
   private Collection<Apps> appsCollection;
   public Users() {
   }
   public Users(String username) {
    this.username = username;
   }
   public Users(Integer userId) {
    this.userId = userId;
   }
   public Users(Integer userId, String username, String password, String email, int permissions) {
    this.userId = userId;
    this.username = username;
    this.password = password;
    this.email = email;
    this.permissions = permissions;
   }
   public Integer getUserId() {
    return userId;
   }
   public void setUserId(Integer userId) {
    this.userId = userId;
   }
   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 getPermissions() {
    return permissions;
   }
   public void setPermissions(int permissions) {
    this.permissions = permissions;
   }
   public Sessions getSessions() {
    return sessions;
   }
   public void setSessions(Sessions sessions) {
    this.sessions = sessions;
   }
   public Country getCountry() {
    return country;
   }
   public void setCountry(Country country) {
    this.country = country;
   }
   @XmlTransient
   public Collection<Apps> getAppsCollection() {
    return appsCollection;
   }
   public void setAppsCollection(Collection<Apps> appsCollection) {
    this.appsCollection = appsCollection;
   }
   public boolean isValid(String password) {
    try {
	    return this.password.equals(MySqlTools.MD5Encode(password));
    } catch (NoSuchAlgorithmException ex) {
	    ex.printStackTrace();
    }
    return false;
   }
   @Override
   public int hashCode() {
    int hash = 0;
    hash += (userId != null ? userId.hashCode() : 0);
    return hash;
   }
   @Override
   public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Users)) {
	    return false;
    }
    Users other = (Users) object;
    if ((this.userId == null && other.userId != null) || (this.userId != null && !this.userId.equals(other.userId))) {
	    return false;
    }
    return true;
   }
   @Override
   public String toString() {
    return "Users{" + "userId=" + userId + ", username=" + username + ", password=" + password + ", email=" + email + ", permissions=" + permissions + ", sessions=" + sessions + ", country=" + country + ", appsCollection=" + appsCollection + '}';
   }
}

Alguem tem ideia do que se poça estar a passar? É normal jackson estar a funcionar bem para um tipo de output e noutro não? Falta-me alguma annotation?

Cumprimentos,

Eduardo Oliveira

Share this post


Link to post
Share on other sites
knoker

Peço imensas desculpas não sei como fiz isso... Já estive a ver mas acho que não consigo apagar os outros tópicos. alguém que consiga por favor apague....

Mais uma vez peço desculpa,

Cumprimentos,

Eduardo Oliveira

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.