1

Jersey を使用して非常に単純な RESTful Web サービスを作成しようとしています。JAXB を使用して JSON を消費および生成するようにしようとしています。問題は、JSON を渡すとエラーが発生することです。

以下はリソースコードです。status() と echo() の両方が正常に動作しています。processRequest() では、現在テキスト応答を生成していますが、後で JSON を生成するように変更されることに注意してください。

package web_service;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/")
public class WebService {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String status() {
        return "Web service is up and running.";
    }

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.TEXT_PLAIN)
    public String echo(String consumed) {
        return consumed;
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String processRequest(JAXBElement<Request> r) {
        Request request = r.getValue();
        return "Latitude: " + request.latitude +
            "\n:Longitude: " + request.longitude;
    }
}

これはリクエストモデルです:

package web_service;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Request {

    public String latitude;
    public String longitude;

    public Request() {}

    public Request(String latitude, String longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    // Getters and setters for both
}

私のweb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5">

     <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>web_service</param-value>
         </init-param>

         <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

最後に、これは私が行っている POST の例です (ヘッダーは「Content-Type: application/json」に設定されています)。

{
    "latitude":"25.764084501106787",
    "longitude":"-80.37422332275389"
}

これを実行すると、Tomcat から次の例外が返されます。

WARNING: WebApplicationException cause:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class web_service.Request, genericType=class     web_service.Request.

そして、私は次の応答を受け取ります:

415 Unsupported Media Type

Content-Length: 1 kB
Content-Type:   text/html;charset=utf-8
Date:           2013 Nov 4 17:41:20
Server:         Apache-Coyote/1.1

ここに画像の説明を入力

私はこれに非常に慣れていないので、あまり意味がありません。うまくいけば、あなたの一人が私に手を差し伸べることができます。ありがとう!

4

5 に答える 5

1

JAXB (XML Binding の Java アーキテクチャ) は、JSON ではなく xml をバインドするためにJava利用できます。そして、JAX-RSパッケージの「 BodyWriterクラス」によって生成されたエラーが発生しているに違いないと確信しています....

とにかく、リソースを使用して JSON を生成および使用する場合は、この変換を処理するために、プロジェクト ライブラリで利用可能な " moxy " JARが必要になります :)

私がここに書いていることが他のプログラマーに役立つことを願っています

于 2015-10-20T13:41:32.157 に答える
1

エンドポイントでこれを試してください:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String processRequest(Coordinates coordinates) {
    return "Latitude: " + coordinates.getLatitude() +
        "\n:Longitude: " + coordinates.getLongitude();
}

whereCoordinatesは、投稿する JSON コンテンツをミラーリングする単純な POJO です。

次に、すべてのライブラリをプロジェクトに追加し、次の構成を追加して、JAXB をサポートする Jackson を使用します。

<init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value>   
</init-param>

「Jersey REST Service」サーブレットに。

于 2013-11-04T23:30:40.110 に答える
1

これを web.xml に追加します

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

詳細については、ジャージのドキュメントをご覧ください: https://jersey.java.net/documentation/1.18/json.html

于 2014-04-24T06:15:50.700 に答える
0

このエラーは、ヘッダーを指定せずにリクエストした場合に発生します。あなたのサービスで @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN)

リクエストがヘッダー「content-type」を取得していることを確認してください。application/json およびヘッダー「accept」には text/html が含まれています

于 2014-01-27T15:08:35.450 に答える