0

I want to serialise an enum containing details of a web API error into JSON. The entire application is a REST API is being built with Jakarta's APIs. I am using Jakarta EE's Jsonb for serializing and deserializing to and from JSON. My enum is as follows:

import jakarta.json.bind.annotation.JsonbProperty;
import jakarta.json.bind.annotation.JsonbTypeSerializer;

@JsonbTypeSerializer(value = ErrorMessageJsonSerializer.class)
public enum ErrorMessage {
    INVALID_CREDENTIALS(4001, "invalid credentials", ""),
    EXPIRED_AUTHORIZATION_CODE(4002, "expired authorization code", "");

    @JsonbProperty
    public final int CODE;
    @JsonbProperty
    public final String MESSAGE;
    @JsonbProperty
    public final String DOCUMENTATION;

    ErrorMessage(int code, String message, String docs) {
        this.CODE = code;
        this.MESSAGE = message;
        this.DOCUMENTATION = docs;
    }

    public int getCODE() {
        return CODE;
    }

    public String getMESSAGE() {
        return MESSAGE;
    }

    public String getDOCUMENTATION() {
        return DOCUMENTATION;
    }
}`

When I pass an enum ErrorMessage.INVALID_CREDENTIALS to my response object all I get is "INVALID_CREDENTIALS", but I was hoping to get the JSON response in my client like so:

`{
    "CODE": 4001,
    "MESSAGE": "invalid credentials",
    "DOCUMENTATION": "http://linktodocumentation.com/invalid_credentials"
}`

So, I implemented the JsonbProperty interface like so:

import jakarta.json.bind.serializer.JsonbSerializer;
import jakarta.json.bind.serializer.SerializationContext;
import jakarta.json.stream.JsonGenerator;

public class ErrorMessageJsonSerializer implements JsonbSerializer<ErrorMessage> {
    @Override
    public void serialize(ErrorMessage errorMessage, JsonGenerator jsonGenerator, SerializationContext serializationContext) {
        jsonGenerator.writeStartObject();

        jsonGenerator.write("errorCode", errorMessage.CODE);
        jsonGenerator.write("errorMessage", errorMessage.MESSAGE);
        jsonGenerator.write("documentationLink", errorMessage.DOCUMENTATION);

        jsonGenerator.writeEnd();

        serializationContext.serialize(errorMessage, jsonGenerator);
    }
}`

But I am still getting "INVALID_CREDENTIALS" and not the full blown JSON just like I should if I was using a class.

Please what am I missing?

P.S: I don't want to use Jackson and my container is GlassFish 6.2.5.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555

0 Answers0