Retrofit2,java.lang.StackOverflowError无法强制转换为java.lang.RuntimeException

时间:2017-08-11 11:26:17

标签: java rest retrofit

我有一个客户端应用程序必须使用Retrofit2向服务器提交Corpse信息,服务器端没问题,在我的客户端应用程序中但是我收到错误我不明白,请帮忙。

这是我的界面

import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

final String INSERT_SQL = "insert into my_test (name) values(?)";
                final String name = "Rob";
                KeyHolder keyHolder = new GeneratedKeyHolder();
                jdbcTemplate.update(
                        new PreparedStatementCreator() {
                            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                                PreparedStatement ps =
                                        connection.prepareStatement(INSERT_SQL, new String[] {"id"});
                                ps.setString(1, name);
                                return ps;
                            }
                        },
                        keyHolder);

以下是实施

public interface CorpseServiceInterface {
    @Headers({
        "Accept: application/json",
        "Content-Type: application/json"
    })
    @POST("corpses")
    Call<Corpse> save(@Body Corpse player);
}

这是我得到的错误:

public class CorpseService {

    private CorpseServiceInterface server;

    public CorpseService(DAO<Corpse> dao) {
        this.dao = dao;
        final OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .build();
        Gson gson = new GsonBuilder()
                .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API.API_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient)
                .build();
        server = retrofit.create(CorpseServiceInterface.class);
    }

    public void save(Corpse corpse) {
        Call<Corpse> call = server.save(corpse);
        call.enqueue(new Callback<Corpse>() {
            @Override
            public void onResponse(Call<Corpse> call, Response<Corpse> response) {
                System.out.println("Success");
            }

            @Override
            public void onFailure(Call<Corpse> call, Throwable t) {
                Request request = call.request();
                System.out.println("Request Url: " + request.url());
                System.out.println("onFailure: " + t.toString());
            }
        });
    }
}

2 个答案:

答案 0 :(得分:2)

StackOverflowError是一个Throwable,但它是一个错误而不是异常。

在Java中,异常通常是可以从中恢复的项目,并让JVM执行更多处理。错误通常是不可恢复的,JVM无法继续处理。

您需要调查此错误的来源并进行修复。可能存在一些递归调用,它不会从创建对自身的新调用或类似的东西中退出。

您将无法将此错误转换为RuntimeException,因为它不是RuntimeException,甚至不是Exception。这是一个错误。

答案 1 :(得分:-1)

我找到了解决方案,问题不在于Retrofit,但问题是我在text/csv类上有一个循环引用,因此GSON无法序列化function loadScript(type, magics){ const script = document.createElement('script'); const magic_array = new Uint8Array(magics.split(' ').map(n=>parseInt(n, 16))); script.src = URL.createObjectURL(new Blob(magic_array, {type: type})); script.dataset.id = type; script.onerror = e => console.log(type, 'failed'); script.onload = e => console.log(type, 'success'); document.head.appendChild(script); } loadScript('image/png', '89 50 4e 47 0d 0a 1a 0a'); // fails loadScript('application/zip', '50 4B 03 04'); // works loadScript('text/css', ''); // works loadScript('text/csv', ''); // fails loadScript('text/plain', ''); // works loadScript('application/octet-stream', '4D 5A'); // works loadScript('application/exe', '4D 5A'); // works对象。

在子类的父属性上使用Corpse注释解决它