Обработчик отклонения Akka для возврата ответа JSON - PullRequest
1 голос
/ 29 апреля 2019

Я пробую что-то с помощью Akka HTTP, и я нашел это на официальном doc , а код сниппета выглядит так

final RejectionHandler rejectionHandler = RejectionHandler.defaultHandler()
    .mapRejectionResponse(response -> {
    if (response.entity() instanceof HttpEntity.Strict) {
        // since all Akka default rejection responses are Strict this will handle all rejections
        String message = ((HttpEntity.Strict) response.entity()).getData().utf8String()
            .replaceAll("\"", "\\\"");
        // we create a new copy the response in order to keep all headers and status code,
        // replacing the original entity with a custom message as hand rolled JSON you could the
        // entity using your favourite marshalling library (e.g. spray json or anything else)
        return response.withEntity(ContentTypes.APPLICATION_JSON,
            "{\"rejection\": \"" + message + "\"}");
    } else {
        // pass through all other types of responses
        return response;
    }
});

Теперь я застрял там, где мне нужночтобы преобразовать JSON-тип во что-то «чище», а не в конкатенацию строк.

return response.withEntity(ContentTypes.APPLICATION_JSON,
    "{\"rejection\": \"" + message + "\"}");

Я знаю, что могу использовать ObjectMapper (), но я ищу способ выполнения задач по умолчанию.Метод волшебного соуса, который бы взял Marshaller, класс и объект, чтобы сделать вещи.Есть идеи?

До сих пор я пробовал что-то вроде этого

String message = ((HttpEntity.Strict) response.entity()).getData().utf8String();
HttpEntity.Strict jsonMessage = HttpEntities.create(ContentTypes.APPLICATION_JSON, message);

HttpResponse httpResponse = HttpResponse.create()
                           .withStatus(response.status().intValue())
                           .withEntity(jsonMessage);
return httpResponse;

Но все же я получаю текстовый / простой ответ, хотя заголовки содержимого установлены в Content-Type → application /JSON.

...