5

JSONをJerseyRESTサービスに投稿する際に問題があります-GETは完全に機能していますが、POSTには注意が必要です。私はこの問題にしばらく取り組んできましたが、今のところ解決策はありません。どんな助けでも大歓迎です!

jsonを送信するURLが見つからないようです。FireBugコンソールに表示される内容は次のとおりです。

    POST http://localhost:9998/data 400 Bad Request
    Post source: name=Tony
    **Response Headers**
    Connection  close
    Content-Length  0
    Content-Type    text/html; charset=iso-8859-1
    Date    Fri, 20 Apr 2012 10:13:24 GMT
    **Request Headers**
    Accept  application/json, text/javascript, */*; q=0.01
    Accept-Encoding gzip, deflate
    Accept-Language sv-se,sv;q=0.8,en-us;q=0.5,en;q=0.3
    Connection  keep-alive
    Content-Length  9
    Content-Type    application/json; charset=UTF-8
    Host    localhost:9998
    Referer http://localhost:9998/static/page.html
    User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
    X-Requested-With    XMLHttpRequest

私は次のようにPOSTを行っています:

<button id='btn' value="knapp" name="knapp" />
    <script type="text/javascript">
    $('#btn').click(function(){
        $.ajax({
            url: '/data',
            type: 'POST',
            contentType: 'application/json',
            data: {name:"Tony"},
            dataType: 'json'
        });
    })
</script>

@XmlRootElementを使用したJavabeanクラス:

@XmlRootElement
public class StatusBean {
    private String name;

    public StatusBean() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

リソースメソッド:

@Path("/data")
public class PostData {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public StatusBean post(StatusBean sb) {
        System.out.println(sb);
        return sb;
    }
}

Grizzlyでセットアップされたサーバー:

public class Main {
    public static final URI BASE_URI = getBaseURI();

    public static void main(String[] args) throws IOException {
        HttpServer httpServer = startServer();

        Map<String,String> initParams = new HashMap<String, String>();
        initParams.put("com.sun.jersey.config.property.packages", "server");
        SelectorThread selector = GrizzlyWebContainerFactory.create("http://localhost:9998/", initParams );

        System.out.println(String.format("Jersey app started with WADL available at "
                + "%sapplication.wadl\nTry out %shelloworld\nHit enter to stop it...",
                BASE_URI, BASE_URI));

        System.in.read();
        httpServer.stop();
    }

    protected static HttpServer startServer() throws IOException {
        System.out.println("Starting grizzly...");

        ClassNamesResourceConfig rc = new ClassNamesResourceConfig(PostData.class);

//        rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);

        HttpServer server = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);

        server.getServerConfiguration().addHttpHandler(new StaticHttpHandler(new File(".").getAbsolutePath()), "/static");

        return server;
    }

    private static int getPort(int defaultPort) {
        String port = System.getProperty("jersey.test.port");
        if (null != port) {
            try {
                return Integer.parseInt(port);
            } catch (NumberFormatException e) {
            }
        }
        return defaultPort;
    }

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost/").port(getPort(9998)).build();
    }
}
4

5 に答える 5

2
  1. Beanをシリアライズ可能にしてみてください。

    @XmlRootElement
    
    public class StatusBean implements Serializable {
    ....
    }
    
  2. POSTURLを確認してください。`である必要があります

    http:// localhost:9998 / {projectname} / {restservletmapping} / data

    たとえば、web.xmlが次のようになり、プロジェクト名がSampleProjectの場合

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

    URLは次のようになります:http:// localhost:9998 / SampleProject / rest / data

    ツールを使用して、SOAP UIなどのRESTサービスや、POSTMAN、RESTCONSOLEなどのブラウザーアドオンをテストできます。

  3. 上記のことが問題なく、RESTサービスがテストツールで応答している場合。次に、ajaxのクロスオリジンポリシーの問題である可能性があります。

于 2012-04-20T12:17:43.477 に答える
1

サーバー構成から、Grizzly で JAX-RS を構成していないことがわかります。そのに基づいて、何らかの形でそのようなプロパティを渡す必要があります

Map<String,String> initParams = new HashMap<String, String>();
initParams.put( "com.sun.jersey.config.property.packages", "package.with.your.StatusBean.class" );

別の構成オプションは、使用することです

ResourceConfig rc = new PackagesResourceConfig("your.package.with.resources");

グリズリーサーバーを起動します。

GrizzlyServerFactory.createHttpServer(BASE_URI, rc);

詳細を参照してください: http://jersey.java.net/nonav/documentation/latest/user-guide.html (「ルート リソースのデプロイ」の章)。彼らが持っている最初の例を実行してみてください。

于 2012-04-20T12:26:22.930 に答える
0

投稿先のパスが完全であることを確認しますか? Pathメソッドに別の注釈を定義postし、投稿先の URL でそれを使用する必要があります。

@Path("/data")
public class PostData {
    @Path("/postStatus")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public StatusBean post(StatusBean sb) {
        System.out.println(sb);
        return sb;
    }
}

次に、/data/postStatusパスを使用して、リクエストを次の場所に投稿します。

<button id='btn' value="knapp" name="knapp" />
<script type="text/javascript">
    $('#btn').click(function(){
        $.ajax({
            url: '/data/postStatus',

            type: 'POST',
            contentType: 'application/json',
            data: {name:"Tony"},
            dataType: 'json'
        });
    })
</script>
于 2012-04-20T11:24:01.980 に答える
0

JSON マッパー、つまり Jackson (または使用しているマッパー) を登録するのを忘れている可能性があります。この機能は自動的には有効になりません。ResourceConfig にクラスをロードする必要があります。

org.glassfish.jersey.jackson.JacksonFeature.class

サンプル

また、JSON ハウツーも参照してください。

于 2017-07-20T10:13:53.050 に答える