RequestBodyTranslations.java

package net.hostsharing.hsadminng.errors;

import net.hostsharing.hsadminng.config.MessageTranslator;
import net.hostsharing.hsadminng.config.RetroactiveTranslatorWithPlaceholderSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

// HOWTO translate technical request-body parse errors (here from Jackson) into human-readable messages
@Service
public class RequestBodyTranslations implements RetroactiveTranslatorWithPlaceholderSupport {

    private static final String NO_PREFIX = "";

    private static final List<TranslatableMessage> TRANSLATABLE_MESSAGES = List.of(
            new TranslatableMessage(
                    NO_PREFIX,
                    "(?s)^JSON parse error: Cannot deserialize value of type `java\\.lang\\.String` from Object value.*$",
                    "general.a-plain-text-value-was-expected-but-a-json-object-was-provided"),
            new TranslatableMessage(
                    NO_PREFIX,
                    "(?s)^JSON parse error: Cannot deserialize value of type `[^`]*Map[^`]*` from Array value.*$",
                    "general.a-json-object-with-key-value-pairs-was-expected-but-a-json-array-was-provided")
    );

    @Autowired
    private MessageTranslator messageTranslator;

    @Override
    public MessageTranslator getMessageTranslator() {
        return messageTranslator;
    }

    @Override
    public List<TranslatableMessage> getTranslatableMessages() {
        return TRANSLATABLE_MESSAGES;
    }
}