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.