1
votes

I am developing RESTful web service using JAX-RS (Jersey) and Glassfish as server. I implemented simple method that returns list of entites and when I attempting to access it server drops 500 error with

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json.

I tried to add Genson lib to my project but this doesn't help. What's wrong with my code?

My entity

@XmlRootElement
public class Device {

    public Device(){}

    public Device(String vendor, String model) {
        this.vendor = vendor;
        this.model = model;
    }
    public String vendor;
    public String model;
}

Service

@Path("devices")
public class Devices {
    @Context
    Application app;
    @Context
    Providers providers;

    @GET
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response getAll(){
        List<Device> result = new ArrayList<>();
        result.add(new Device("Samsung","Galaxy S4"));
        return Response.ok().entity(result).build();
    }
}

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <display-name>Kontroller</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.drozdov.kontroller.api, com.drozdov.kontroller.models</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

</web-app>

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.drozdov</groupId>
    <artifactId>Kontroller</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>
    </dependencies>
</project>
1

1 Answers

1
votes

Are you using Jersey 2? If yes this is probably the reason why it does not work. Try with latest Genson release. It is supposed to also work out of the box with Jersey 2+.

<dependency>
  <groupId>com.owlike</groupId>
  <artifactId>genson</artifactId>
  <version>1.2</version>
</dependency>