JAX-RS - błąd w metodzie getClass.

0

Mam taki problem.

Gdy metoda getClasses jest zakomentowana, program działa poprawnie.
W przeciwnym wypadku dostaje wyjątek "MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList."

Wgrana jest biblioteka genson-0.93

Main.java

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/web-api")
    public class MainRest extends Application {
//    @Override
//    public Set<Class<?>> getClasses() {
//        Set<Class<?>> classes = new HashSet<Class<?>>();
//        classes.add(CoffeesResource.class);
//        return classes;
//    }

}

CoffeesResource.java

@Path("/hello")
public class CoffeesResource {
    
//      vb.mediaTypes(MediaType.APPLICATION_XML_TYPE,
//                       MediaType.APPLICATION_JSON_TYPE)
//        .languages(new Locale("en"), new Locale("es"))
//        .encodings("deflate", "gzip").add();

    
    @GET
//    @Consumes(MediaType.TEXT_HTML)
    @Produces(MediaType.APPLICATION_JSON)
    public Response getCoffeList(@Context Request r) {
        System.out.println("GOGOGO:");
        Variant.VariantListBuilder vb = Variant.VariantListBuilder.newInstance();
//        vb.mediaTypes(MediaType.TEXT_HTML_TYPE, MediaType.APPLICATION_XML_TYPE);
        vb.mediaTypes(MediaType.APPLICATION_JSON_TYPE);
        List<Variant> variants = vb.build();
        Variant v = r.selectVariant(variants);
        
        System.out.println(v.getMediaType());
        
        if(v == null) return Response.notAcceptable(variants).build();
        InitCoffes ic = new InitCoffes();
        
        Response.ResponseBuilder builder = Response.ok(ic.getInitList());
        return builder.build();
    }
    
}
0

Do obsługi list potrzebujesz wrappera. Możesz albo napisać swój, albo użyć GenericEntity:

GenericEntity<List<Coffes>> list = new GenericEntity<List<Coffes>>(ic.getInitList()) {};
return Response.ok(list).build();

https://jersey.java.net/apidocs/1.5/jersey/javax/ws/rs/core/GenericEntity.html

0

Dziękuję za pomoc.

Ma Pan może pomysł jak sprawdzić czy TYP MIME klienta, który wysłał żadanie jest zgodny z typem który my obsługujemy??

kod po zmianach

@Path("/hello")
public class CoffeesResource {

    @GET
//    @Consumes(MediaType.TEXT_HTML)
    @Produces(MediaType.APPLICATION_XML)
    public Response getCoffeList(@Context Request r) {
        System.out.println("GOGOGO:");
        Variant.VariantListBuilder vb = Variant.VariantListBuilder.newInstance();
//        vb.mediaTypes(MediaType.TEXT_HTML_TYPE, MediaType.APPLICATION_XML_TYPE);
        vb.mediaTypes(MediaType.APPLICATION_JSON_TYPE);
        List<Variant> variants = vb.build();
        Variant v = r.selectVariant(variants);
        System.out.println(v);
        if(v == null) return Response.notAcceptable(variants).build();
        InitCoffes ic = new InitCoffes();
        GenericEntity<List<Coffe>> list = new GenericEntity<List<Coffe>>(ic.getInitList()) {};
        return Response.ok(list).build();        
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1