1

json との間で変換する必要があるエンティティ (リスト) のコレクションがあります。

POJO:

public class Task {

    private Long id;

    private String title;

    private Boolean done;
    (...)
}

ジャージーは次の結果を生成します

[{"id":1,"title":"T1","done":false},{"id":2,"title":"T2","done":false}]

メソッドを呼び出すと:

@GET
@Override
@Produces("application/json")
public List<Task> findAll() {
    (...)
    return tasks;
}

ここまでは順調ですね。

ここで、同様の JSON 文字列を使用する必要があります。次の方法でうまくいくと思いました。

@PUT
@Consumes("application/json")
public void save(List<Task> tasks) {
    (...)
}

しかし、代わりに以下のエラーが表示されます。

    SEVERE:   line 1:0 no viable alternative at input
'"[{\"id\":1,\"title\":\"T1\",\"done\":true},{\"id\":2,\"title\":\"T2\",\"done\":false}]"'

私は何を間違っていますか?それは可能ですか?

ジャージーの依​​存関係:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.1</version>
</dependency>

これがweb.xml構成です

<servlet>
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>my.rest.package</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Jersey Servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
4

3 に答える 3

2

メッセージ本文のエンティティとして、次のような破損した JSON を送信しているようです。

POST http://localhost:9998/test/list
Accept: application/json
Content-Type: application/json
"[{\"a\":\"a\",\"b\":1,\"c\":1}]"

このようなエンティティであなたと同じエラーを得ることができました(line 1:0 no viable alternative at input '"[{\"a\":\"a\",\"b\":1,\"c\":1}]"')。

アプリケーションにロギング フィルタを登録して、有効な JSON を REST サービスに送信していることを確認してください。

new ResourceConfig()
    .packages("my.rest.package")
    // Register logging filter and print entity.
    .register(new LoggingFilter(LOGGER, true));
于 2013-08-01T13:23:31.950 に答える
0

型パラメーターは、型消去後に使用できません。

リストの代わりに配列を使用してみてください:

@PUT
@Consumes("application/json")
public void save(Task[] taskArray) {
    List<Task> tasks = Arrays.asList(taskArray);
    (...)
}
于 2013-08-01T11:49:19.883 に答える
0

または、受信 JSON を文字列として受け入れ、標準パーサーを使用してメソッド内で解析することもできます。

@PUT
public void save(String s) {
   // parse s
}
于 2013-07-31T19:02:58.693 に答える