Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Serialização com JAXB para Json

No curso foi mostrado como utilizar a serialização com o JAXB e retornar um xml, conforme código abaixo:

@Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Carrinho busca(@PathParam("id") long id) {
        Carrinho carrinho = new CarrinhoDAO().busca(id);
        return carrinho;
    }

Eu gostaria de utilizar o JAXB para retornar um Json agora, fiz a seguinte alteração no código para:

@Path("{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Carrinho busca(@PathParam("id") long id) {
        Carrinho carrinho = new CarrinhoDAO().busca(id);
        return carrinho;
    }

ao executar o serviço estou tomando o seguinte erro:

status# HTTP/1.1 500 MessageBodyWriter not found for media type=application/json, type=class br.com.alura.loja.modelo.Carrinho, genericType=class br.com.alura.loja.modelo.Carrinho.

queria retornar em Json, alguém poderia me ajudar?

8 respostas

Fala Fábio, tudo bem ?

Imagino que falta apenas as dependências da jackson json, lib de serialização utilizada pra gerar JSON. Tente adicionar a dependência no seu pom.xml:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.25</version> verifique a versão no mvn repository
  <scope>runtime</scope>
</dependency>

Creio que isso deve ajudar

Abraço!

Rafael, primeiramente, muito obrigado pela ajuda!

Seguindo as suas instruções eu baixei o seguinte jar: jersey-media-json-jackson-2.25.jar

mas após colocar esse jar eu tomo o seguinte erro ao tentar executar a aplicação:

Exception in thread "main" java.lang.UnsupportedClassVersionError: JVMCFRE003 versão principal inválida; class=org/glassfish/jersey/jackson/internal/JacksonAutoDiscoverable, offset=6
    at java.lang.ClassLoader.defineClass(ClassLoader.java:265)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:69)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:521)
    at java.net.URLClassLoader.access$300(URLClassLoader.java:66)
    at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:985)
    at java.security.AccessController.doPrivileged(AccessController.java:284)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:416)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:643)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:346)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:609)
    at java.lang.Class.forNameImpl(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.glassfish.jersey.internal.util.ReflectionHelper$6.run(ReflectionHelper.java:374)
    at org.glassfish.jersey.internal.util.ReflectionHelper$6.run(ReflectionHelper.java:369)
    at java.security.AccessController.doPrivileged(AccessController.java:251)
    at org.glassfish.jersey.internal.ServiceFinder$LazyObjectIterator.hasNext(ServiceFinder.java:689)
    at org.glassfish.jersey.internal.ServiceFinderBinder.configure(ServiceFinderBinder.java:91)
    at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:171)
    at org.glassfish.hk2.utilities.binding.AbstractBinder.install(AbstractBinder.java:315)
    at org.glassfish.jersey.server.ServerBinder.configure(ServerBinder.java:123)
    at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:171)
    at org.glassfish.jersey.internal.inject.Injections.bind(Injections.java:158)
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:148)
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:137)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:272)
    at org.glassfish.jersey.server.ContainerFactory.createContainer(ContainerFactory.java:79)
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:110)
    at br.com.alura.loja.Servidor.inicializaServidor(Servidor.java:27)
    at br.com.alura.loja.Servidor.main(Servidor.java:17)

Fala Fábio, tudo bem ?

Parece problema de compatibilidade entre as versões do jersey e da lib de serialização. Dá uma pesquisada em qual a versão da lib é mais adequada pra versão do framework que está utilizando. Aí imagino que trocando pro certo, já pare de dar esse problema.

Consegui achar um .jar compatível mas não resolveu o problema, acredito que por não estar usando o maven e só colocando o jar jersey-media-json-jackson-2.5.1.jar diretamente no projeto, possa ter ficado faltando mais alguma dependência

:(

solução!

Consegui resolver o problema, para isso foi preciso incluir o seguinte jar

jackson-jaxrs-1.9.13.jar

e no servidor, incluir a seguinte configuração:

 ResourceConfig config = new ResourceConfig()
            .packages("br.com.alura.loja").register(JacksonJsonProvider.class);

Rafael, muito obrigado pela ajuda!!!

Fala Fábio, tudo bem ?

Tava pesquisando por aqui como configurar e vi que além de colocar os jars na aplicação (realmente a dependencia traz mais jars pra gente), tem passar mais um parâmetro de inicialização pra servlet mapeada pra suportar a serialização pra JSON.

Dê uma olhada => https://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

Aqui da pra ver quais outros jars a dependência descrita traz pra aplicação.

dependencias

Tenta fazer essas alterações!

Espero ter ajudado. Abraço!

Opa agora que vi =)

Que bom que deu certo!

Foi exatamente isso Rafael, muito obrigado pela ajuda e pela boa vontade!

Abraços