Java Исключение getMessage () возвращает ноль - PullRequest
0 голосов
/ 23 января 2020

При попытке десериализации JSON в объект я ловлю исключение SAXParsingException, которое выглядит следующим образом. Запись из памяти, поэтому она может быть не на 100% правильной, но идея та же.

try {
      validator.validate(source);
      return Response.ok(jsonResponse).build();
    } 
     catch (SAXParseException format) {
       String exceptionStr = format.getMessage();
       exceptionStr = mapper.writeValueAsString(exceptionStr);
       return Response.status(Response.Status.BAD_REQUEST).entity(exceptionStr).build();
    }

Однако getMessage () возвращает ноль. Однако, если я просто верну

return Response.status(Response.Status.BAD_REQUEST).entity(format).build();

, то он возвращает трассировку стека, которая выглядит следующим образом (я вырезал большую часть трассировки стека, поскольку она очень длинная)

   {
"cause": {
    "cause": {
        "stackTrace": [

            {
                "methodName": "run",
                "fileName": "Thread.java",
                "lineNumber": 745,
                "className": "java.lang.Thread",
                "nativeMethod": false
            }
        ],
        "lineNumber": 0,
        "columnNumber": 0,
        "message": "cvc-complex-type.2.4.b: The content of element 'Request' is not complete. One of '{\"blahblahblah":echoData, \"blahblahblah":schemeCode}' is expected.",
        "localizedMessage": "cvc-complex-type.2.4.b: The content of element 'Request' is not complete. One of '{blahablah":echoData, \"blahbblahblah":schemeCode}' is expected."
    },

Так почему getMessage () возвращает ноль, если к исключению прикреплено сообщение?

Ответы [ 3 ]

1 голос
/ 23 января 2020

Помимо решения, которое вы упомянули, в таких случаях было бы неплохо проверить распространение исключений и исправить его так, чтобы «сообщение» не потерялось на верхнем уровне (т. Е. Если у вас есть контроль над обработка исключений)

1 голос
/ 23 января 2020

Получаемый вами объект сериализации произошел из исключения , причина , сообщение все еще пустое. Java исключение, так как SAXParseException обычно содержит поле сообщения и cause exception, в случае, если это было еще одно исключение, источник проблемы.

Возможно, вас заинтересует использование org.apache.commons.lang3.exception.ExceptionUtils.getRootCauseMessage/getRootCauseStackTrace, которое обнаружило root сообщение о причине (как в вашем примере также возможно, что ваша причина имеет саму причину)

0 голосов
/ 23 января 2020

Как указали другие, мне нужно было

String exceptionStr = format.getException (). GetCause (). GetMessage ();

Поскольку мое «Сообщение» было вложено в другие элементы. Спасибо, ребята

...