3

私はこの方法を持っています:

/**
 * POST
 */
public static void create(String body) {
    Logger.info("APPOINTMENT create - json string: %s", body);

    Appointment appointment = null;
    try {
        appointment = new Gson().fromJson(body, Appointment.class);

        //services are detached, re-take them from db
        List<Service> refreshedServices = new ArrayList<Service>();
        for (final Service ser : appointment.services) {
            Service service = Service.findById(ser.id);
            refreshedServices.add(service);
        }
        appointment.services = refreshedServices;
        appointment.save();
        appointment.refresh();
        Logger.info("services refreshed");
    } catch (Exception ex) {
        Logger
                .info(
                        "An error has occured when trying to create an APPOINTMENT %s",
                        ex);
        response.status = Http.StatusCode.INTERNAL_ERROR;
        renderJSON(new StatusMessage(
                "An internal error has occured. Please try again later."));
    }

    renderJSON(appointment);
}

私は次のようにテストしています:

public void createAppointment(final Contact contact, final List<Service> services) throws Exception {
        Appointment app = new Appointment();
        app.userUid = "cristi-uid";
        app.name = "app1";
        app.contact = contact;

        String serviceAsJson = "{\"userUid\":\"cristi-uid\",\"name\":\"app1\",\"allDay\":false,\"contact\":{\"id\":"+contact.id+"},\"services\":[{\"id\":\""+services.get(0).getId()+"\"},{\"id\":\""+services.get(1).getId()+"\"}]}";
        Response response = POST("/appointment/create", "application/json", serviceAsJson);

        Logger.info("POST was done");
        Appointment appReturned = new Gson().fromJson(response.out.toString(), Appointment.class);

        Logger.info("appointment create response: %s", response.out.toString());

        assertIsOk(response);
        assertEquals(appReturned.name, app.name);
    }

問題は、この例外がスローされていることです。

java.lang.RuntimeException: java.util.concurrent.ExecutionException: play.exceptions.JavaExecutionException
at play.test.FunctionalTest.makeRequest(FunctionalTest.java:304)
at play.test.FunctionalTest.makeRequest(FunctionalTest.java:310)
at play.test.FunctionalTest.POST(FunctionalTest.java:152)
at play.test.FunctionalTest.POST(FunctionalTest.java:120)
at play.test.FunctionalTest.POST(FunctionalTest.java:116)
at AppointmentsTest.createAppointment(AppointmentsTest.java:61)

そして、私はその理由を見つけることができません。

Logger.info("services refreshed");その後、例外がスローされて出力されます...

このテスト POST に何か問題があると思いますか?

更新: 問題は、appointmentJSON としてレンダリングしようとしたことに起因するようです:

Caused by: java.lang.StackOverflowError
at java.util.LinkedHashMap$LinkedHashIterator.(LinkedHashMap.java:345)
at java.util.LinkedHashMap$LinkedHashIterator.(LinkedHashMap.java:345)
at java.util.LinkedHashMap$ValueIterator.(LinkedHashMap.java:387)
at java.util.LinkedHashMap$ValueIterator.(LinkedHashMap.java:387)
at java.util.LinkedHashMap.newValueIterator(LinkedHashMap.java:397)
at java.util.HashMap$Values.iterator(HashMap.java:910)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:192)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:879)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
4

2 に答える 2

1

なぜなら:

Play フレームワークには Google の JSON ライブラリ Gson がバンドルされていますが、このライブラリの開発者は、HTTP クライアントに送信される JSON を生成するのに理想的ではない設計上の選択をいくつか行っています。

Erik BakkerがFlexSonの使用を推奨

于 2012-11-06T14:13:17.470 に答える
0

下に降りてエラートレースを調べることで、問題を特定することができました。基本的に、私のAppointmentオブジェクトにはいくつかの関係があり、それらの関係をレンダリングしようとしたときにManyToManyrenderJSONが与えていたようです.StackOverFlow

別のAppointmentオブジェクトを作成し、エクスポートする必要のあるフィールドのみをコピーしました。

    Appointment appointmentOutput = new Appointment();
    appointmentOutput.id = appointment.id;
    appointmentOutput.name = appointment.name;

    renderJSON(appointmentOutput);
于 2012-09-05T19:53:17.947 に答える