webentwicklung-frage-antwort-db.com.de

So senden und empfangen Sie JSON-Daten von einem restful-Webservice mithilfe der Jersey-API

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

    @POST
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject sayPlainTextHello(@PathParam("id")JSONObject inputJsonObj) {

        String input = (String) inputJsonObj.get("input");
        String output="The input you sent is :"+input;
        JSONObject outputJsonObj = new JSONObject();
        outputJsonObj.put("output", output);

        return outputJsonObj;
    }
} 

Dies ist mein Webservice (ich benutze Jersey API). Ich konnte jedoch keine Möglichkeit finden, diese Methode von einem Java-Restclient aus aufzurufen, um die Json-Daten zu senden und zu empfangen. Ich habe versucht, den Client folgendermaßen zu schreiben

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
JSONObject inputJsonObj = new JSONObject();
inputJsonObj.put("input", "Value");
System.out.println(service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).entity(inputJsonObj).post(JSONObject.class,JSONObject.class));

Dies zeigt jedoch den folgenden Fehler 

Exception in thread "main" com.Sun.jersey.api.client.ClientHandlerException: com.Sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class Java.lang.Class, and MIME media type, application/octet-stream, was not found
15
Ayan Biswas

Ihre Verwendung von @PathParam ist falsch. Es folgt diesen Anforderungen nicht, wie in javadoc hier dokumentiert. Ich glaube, Sie möchten einfach die JSON-Entität POST. Sie können dies in Ihrer Ressourcenmethode beheben, um eine JSON-Entität zu akzeptieren.

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

  @POST
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public JSONObject sayPlainTextHello(JSONObject inputJsonObj) throws Exception {

    String input = (String) inputJsonObj.get("input");
    String output = "The input you sent is :" + input;
    JSONObject outputJsonObj = new JSONObject();
    outputJsonObj.put("output", output);

    return outputJsonObj;
  }
}

Und Ihr Client-Code sollte folgendermaßen aussehen:

  ClientConfig config = new DefaultClientConfig();
  Client client = Client.create(config);
  client.addFilter(new LoggingFilter());
  WebResource service = client.resource(getBaseURI());
  JSONObject inputJsonObj = new JSONObject();
  inputJsonObj.put("input", "Value");
  System.out.println(service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).post(JSONObject.class, inputJsonObj));
20

Bei mir funktionierte der Parameter (JSONObject inputJsonObj) nicht. Ich benutze Trikot 2. * Daher habe ich das Gefühl, dass es das ist 

Java (Jax-rs) und Angular Way

Ich hoffe, es ist hilfreich für jemanden, der Java Rest und AngularJS wie mich verwendet.

@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> methodName(String data) throws Exception {
    JSONObject recoData = new JSONObject(data);
    //Do whatever with json object
}

Clientseitig habe ich AngularJS verwendet

factory.update = function () {
data = {user:'Shreedhar Bhat',address:[{houseNo:105},{city:'Bengaluru'}]}
        data= JSON.stringify(data);//Convert object to string
        var d = $q.defer();
        $http({
            method: 'POST',
            url: 'REST/webApp/update',
            headers: {'Content-Type': 'text/plain'},
            data:data
        })
        .success(function (response) {
            d.resolve(response);
        })
        .error(function (response) {
            d.reject(response);
        });

        return d.promise;
    };
2
shreedhar bhat

Das obige Problem kann durch Hinzufügen der folgenden Abhängigkeiten in Ihrem Projekt gelöst werden, da das gleiche Problem aufgetreten ist. Weitere Informationen zu dieser Lösung finden Sie unter link SEVERE: MessageBodyWriter wurde für media type = application/xml type = class nicht gefunden Java.util.HashMap

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>   


    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>
0
Prakhar Agrawal