Правильный объект JSON не может быть прочитан - PullRequest
0 голосов
/ 30 октября 2019

У меня есть объект, который я хочу проанализировать в строку JSON. Когда я хочу прочитать это, он говорит, что не может разобрать его обратно в объект (я думаю). Это ошибка: enter image description here

Как видно в верхней части консоли, объект JSON установлен правильно с правыми скобками. Из JSONSyntaxException я понимаю, что он не распознает его как объект JSON. Я скопировал этот код из моей школы, и в другом проекте он работает. Я не знаю, почему это не работает в моем проекте Maven.

РЕДАКТИРОВАТЬ Это код для RESTcontroller.java.

public PlayerDTO addPlayer(String name, String password) {
    PlayerDTO playerRequest = new PlayerDTO(NOTDEFINED, name, password);
    String queryPost = "/player";
    PlayerResponse response = executeQueryPost(playerRequest, queryPost);
    return response.getPlayers().get(0);
}

private PlayerResponse executeQueryPost(PlayerDTO playerRequest, String queryPost) {
    final String query = url + queryPost;
    log.info("[Query POST] : " + query);

    HttpPost httpPost = new HttpPost(query);
    httpPost.addHeader("content-type", "application/json");
    StringEntity params;
    try{
        params = new StringEntity(gson.toJson(playerRequest));
        System.out.println(gson.toJson(playerRequest));
        httpPost.setEntity(params);
    } catch (UnsupportedEncodingException e) {
        Logger.getLogger(SeaBattleGame.class.getName()).log(Level.SEVERE, null, e);
    }
    return executeHttpUriRequest(httpPost);
}

private PlayerResponse executeHttpUriRequest(HttpUriRequest httpUriRequest) {

    // Execute the HttpUriRequest
    try (CloseableHttpClient httpClient = HttpClients.createDefault();
         CloseableHttpResponse response = httpClient.execute(httpUriRequest)) {
        log.info("[Status Line] : " + response.getStatusLine());
        HttpEntity entity = response.getEntity();
        final String entityString = EntityUtils.toString(entity);
        log.info("[Entity] : " + entityString);
        return gson.fromJson(entityString, PlayerResponse.class);
    } catch (IOException e) {
        log.info("IOException : " + e.toString());
        PlayerResponse playerResponse = new PlayerResponse();
        playerResponse.setSuccess(false);
        return playerResponse;
    } catch (JsonSyntaxException e) {
        log.info("JsonSyntaxException : " + e.toString());
        PlayerResponse playerResponse = new PlayerResponse();
        playerResponse.setSuccess(false);
        return playerResponse;
    }
}

Имейте в видучто код дал мне этот код, и он работает в их проекте!

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Несколько вещей, чтобы решить проблему:

  1. В методе executeQueryPost необходимо добавить следующие заголовки для запроса:
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");

И код должен выглядеть следующим образом:

private PlayerResponse executeQueryPost(PlayerDTO playerRequest, String queryPost) {
    final String query = url + queryPost;
    log.info("[Query POST] : " + query);

    HttpPost httpPost = new HttpPost(query);
    httpPost.addHeader("content-type", "application/json");
    StringEntity params;
    try{
        params = new StringEntity(gson.toJson(playerRequest));
        System.out.println(gson.toJson(playerRequest));
        httpPost.setEntity(params);

        // Need to add the following headers
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");

    } catch (UnsupportedEncodingException e) {
        Logger.getLogger(SeaBattleGame.class.getName()).log(Level.SEVERE, null, e);
    }
    return executeHttpUriRequest(httpPost);
}

В случае, если код продолжает давать сбой, потому что он не может создать нового игрока. Вы должны обработать исключение в методе addPlayer(). Перед возвратом проверьте, не является ли объект, возвращаемый executeQueryPost, ненулевым.

Обновление :

Возможно, код неисправен только потому, что служба в: http://localhost:8090 не работает, поэтому он получает 500 в качестве ответа.

0 голосов
/ 30 октября 2019

Мне кажется, что ваш запрос не выполняется с этой ошибкой: Problem accessing /seabattle/player Reason: request failed. Это не очень разборчиво, но это что-то.

Ваш код не работает с NullPointerException, я полагаю, response.getPlayers() возвращает null.

Вы должны действительно попытаться отправить аналогичный JSON на эту конечную точку из команды curl или через приложение Postman и посмотреть, работает ли он. Или, если вы можете, просмотрите журналы веб-сервера, чтобы выяснить, в чем заключается настоящая проблема.

РЕДАКТИРОВАТЬ: вам также следует проверить состояние ответа, прежде чем пытаться его проанализировать. Это избавит от NullPointerException и улучшит ваш код в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...