2016-05-28 10 views
0

gefunden wurde ich folgende Ausnahme empfange:Ein Nachrichtentext Autor für Java-Typen nicht

ClientHandlerException: Ein Nachrichtentext Autor für Java-Typen,
Klasse com.company.testing.repo.model.Privilege,
und MIME-Medientyp, application/octet-stream, nicht

Privilege ist eine ENUM-Klasse gefunden wurde:

public enum Privilege { 
    READ, 
    WRITE; 
} 

Ressourceneintrag ist dies:

@Path("repoPrivs") 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    Response getGroups(Privilege privilege); 

mein Client-Code ist dies:

@Override 
public List<MyGroup> getGroups(Privilege privilege) { 
       IWebParamaterProvider provider = WebParamaterFactory.create("repo-mapping/repoPrivs", //$NON-NLS-1$ 
       SecureAction.READ, webProxy); 
     provider = provider.setType(MediaType.APPLICATION_JSON); 
     provider = provider.setAccept(MediaType.APPLICATION_JSON); 
     List<MyGroup> groups = null; 
     groups = webProxy.post(provider, new GenericTypeFactory<MyGroup>(), MyGroup.class, privilege); 
     return groups; 
    } 

Override 
public final <T> List<T> post(IWebParamaterProvider provider, GenericTypeFactory<T> genericsFactory, 
     Class<T> clazz, Object requestEntity){ 
WebResource resource = ((IWebResourceProvider) provider).getWebResource(); 
TRACER.trace("POST: " + resource.getURI().toString()); //$NON-NLS-1$ 
return resource.post(genericsFactory.create(clazz), requestEntity); 

}

public GenericType<List<T>> create(final Class<T> clazz) { 

    ParameterizedType genericType = new ParameterizedType() { 
     @Override 
     public Type[] getActualTypeArguments() { 
      return new Type[] { clazz }; 
     } 

     @Override 
     public Type getOwnerType() { 
      return List.class; 
     } 

     @Override 
     public Type getRawType() { 
      return List.class; 
     } 
    }; 

    return new GenericType<List<T>>(genericType) { 
    }; 
} 

Was ist, dass ich vermisst

+0

Wenn dies Ihre _client_ Bibliothek ist, die Jersey-Client umschließt, weiß niemand, was es tut. Sie können versuchen, einige Jersey-Client-Code zu erarbeiten, der das Problem reproduziert und _that_ code post. Wenn es sich um eine Bibliothek von Drittanbietern handelt, sollten Sie sie erwähnen und möglicherweise einen Link zu ihrer Dokumentation veröffentlichen. Ansonsten ist es unmöglich, dir zu helfen. Dies ist eine Jersey-Ausnahme, aber wir sehen keinen Jersey-Code. –

+0

gerade bearbeitet mein Beitrag, könnten Sie einen Blick – user1782807

Antwort

1

Es ist sehr wichtig, um eine vollständige minimale Prüfung zu ermöglichen So können andere Menschen dir helfen.

Unten haben Sie Jersey 2 und Jersey 1 Beispiel und beide von ihnen im Speicher Testcontainer verwendet. Stellen Sie sicher, dass Sie alle erforderlichen Abhängigkeiten basierend auf der Version erhalten.

Jersey 2

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import org.glassfish.jersey.jackson.JacksonFeature; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.JerseyTest; 
import org.glassfish.jersey.test.inmemory.InMemoryTestContainerFactory; 
import org.glassfish.jersey.test.spi.TestContainerFactory; 
import org.junit.Test; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.GenericType; 
import javax.ws.rs.core.MediaType; 
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

import static javax.ws.rs.core.MediaType.APPLICATION_JSON; 
import static org.junit.Assert.*; 

public class JerseyVersion2Test extends JerseyTest { 

    @Path("hello") 
    public static class HelloResource { 

    @POST 
    @Produces(APPLICATION_JSON) 
    @Consumes(APPLICATION_JSON) 
    public List<MyGroup> doPost(Privilege privilege) { 
     List<MyGroup> myGroups = new ArrayList<>(); 
     MyGroup myGroup = new MyGroup(); 
     myGroup.name = "jersey"; 
     myGroup.version = 2; 
     myGroups.add(myGroup); 
     return myGroups; 
    } 

    } 

    @Override 
    protected Application configure() { 
    return new ResourceConfig(HelloResource.class); 
    } 

    @Override 
    protected TestContainerFactory getTestContainerFactory() { 
    return new InMemoryTestContainerFactory(); 
    } 

    @Test 
    public void testPost() { 
    List<MyGroup> myGroups = getGroups(); 
    assertEquals(1, myGroups.size()); 
    } 

    public enum Privilege { 
    READ, 
    WRITE; 
    } 

    public List<MyGroup> getGroups() { 
    List<MyGroup> groups = target("hello").request(). 
      accept(MediaType.APPLICATION_JSON). 
      post(Entity.json(Privilege.READ)). 
      readEntity(new GenericTypeFactory<MyGroup>().create(MyGroup.class)); 
    return groups; 
    } 

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 
    public static class MyGroup { 
    private String name; 
    private double version; 
    } 

    public class GenericTypeFactory<T> { 
    public GenericType<List<T>> create(final Class<T> clazz) { 

     ParameterizedType genericType = new ParameterizedType() { 
     @Override 
     public Type[] getActualTypeArguments() { 
      return new Type[]{clazz}; 
     } 

     @Override 
     public Type getOwnerType() { 
      return List.class; 
     } 

     @Override 
     public Type getRawType() { 
      return List.class; 
     } 
     }; 

     return new GenericType<List<T>>(genericType) { 
     }; 
    } 
    } 

} 

Jersey 1

import com.fasterxml.jackson.annotation.JsonAutoDetect; 
import com.sun.jersey.api.client.GenericType; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.test.framework.AppDescriptor; 
import com.sun.jersey.test.framework.JerseyTest; 
import com.sun.jersey.test.framework.LowLevelAppDescriptor; 
import com.sun.jersey.test.framework.spi.container.TestContainerFactory; 
import com.sun.jersey.test.framework.spi.container.inmemory.InMemoryTestContainerFactory; 
import org.junit.Test; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

import static javax.ws.rs.core.MediaType.APPLICATION_JSON; 
import static org.junit.Assert.assertEquals; 

public class JerseyVersion1Test extends JerseyTest { 
    @Path("hello") 
    public static class HelloResource { 

    @POST 
    @Produces(APPLICATION_JSON) 
    @Consumes(APPLICATION_JSON) 
    public List<MyGroup> doPost(Privilege privilege) { 
     List<MyGroup> myGroups = new ArrayList<>(); 
     MyGroup myGroup = new MyGroup(); 
     myGroup.name = "jersey"; 
     myGroup.version = 1.12; 
     myGroups.add(myGroup); 
     return myGroups; 
    } 

    } 

    @Override 
    protected AppDescriptor configure() { 
    return new LowLevelAppDescriptor.Builder(HelloResource.class).build(); 
    } 

    @Override 
    protected TestContainerFactory getTestContainerFactory() { 
    return new InMemoryTestContainerFactory(); 
    } 

    @Test 
    public void testPost() { 
    List<MyGroup> myGroups = getGroups(); 
    assertEquals(1, myGroups.size()); 
    } 

    public enum Privilege { 
    READ, 
    WRITE; 
    } 

    public List<MyGroup> getGroups() { 
    WebResource webResource = resource(); 
    List<MyGroup> groups = webResource.path("hello"). 
      accept(MediaType.APPLICATION_JSON). 
      type(MediaType.APPLICATION_JSON). 
      post(new GenericTypeFactory<MyGroup>().create(MyGroup.class), Privilege.READ); 
    return groups; 
    } 

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 
    public static class MyGroup { 
    private String name; 
    private double version; 
    } 

    public class GenericTypeFactory<T> { 
    public GenericType<List<T>> create(final Class<T> clazz) { 

     ParameterizedType genericType = new ParameterizedType() { 
     @Override 
     public Type[] getActualTypeArguments() { 
      return new Type[]{clazz}; 
     } 

     @Override 
     public Type getOwnerType() { 
      return List.class; 
     } 

     @Override 
     public Type getRawType() { 
      return List.class; 
     } 
     }; 

     return new GenericType<List<T>>(genericType) { 
     }; 
    } 
    } 
} 
+0

Bitte Kommentar hinzufügen, wenn Sie unten abstimmen, damit ich meine Antworten verbessern kann – Veeram

+0

Vielen Dank für Ihre Antwort, aber ich habe nicht, was Änderungen haben Sie tatsächlich tun, können Sie bitte erklären, – user1782807

+0

ich verwendet diese "Collections.singletonList (privilege)" und keinen Fehler erhalten, aber die Liste, die ich vom Server bekomme, ist jetzt leer. Ich debuggte den Server-Code und dort gibt es die Liste korrekt zurück. – user1782807

0

javax.xml.bind.annotation.XmlRootElement

Java doc:

Die @XmlRootElement Anmerkung kann mit dem folgenden Programm Elemente verwendet werden:

  • eine Top-Level-Klasse
  • ein Aufzählungstyp

    [...]

Wenn eine Top-Level-Klasse oder ein Aufzählungstyp mit der @ XmlRootElement-Annotation versehen ist, wird ihr Wert als XML-Element i dargestellt n ein XML-Dokument.

in Ihrem Fall ist es klar, dass Jersey nicht in der Lage, die eingehende JSON Nutzlast zu Ihrem Objekt entordnen, damit die Ausnahme

Ein Nachrichtentext Autor für Java-Typen, Klasse com.company.testing.repo. Modell.Privilege

mit Anmerkungen versehen Enum (Privileg) mit @XmlRootElement sollte das Problem lösen.

@XmlRootElement 
public enum Privilege { 
    READ, 
    WRITE; 
} 
+0

dies nicht mein Problem – user1782807

+0

Die Ausnahme, die Sie bekam lösen heißt es, dass alle Jersey eine hatte Problem mit dem Unmarashalling Ihres JSON zu Ihrem Objekt. dafür löst @XmlRootElement auf. Haben Sie nach der Änderung dasselbe Ausnahmeprotokoll? – LeTex

+0

Es ist nicht fair, dass eine richtige Antwort abgelehnt wird. Ich werde meine Antwort sonst löschen – LeTex