Skip to content

ClassCastException when using XmlAdapter with XmlEnum #256

@wbiller

Description

@wbiller

I wanted to serialize a fairly complex object structure and came across this ClassCastException.
It looks like the XML Adapter is called too early when the type is an enum.

Below snippet demonstrates the error as a JUnit test

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import org.junit.jupiter.api.Test;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;

import static org.assertj.core.api.Assertions.assertThat;

public class XmlEnumAdapterTest {

  private static final XmlMapper MAPPER =
    XmlMapper.builder()
             .defaultUseWrapper(true)
             .addModule(new JaxbAnnotationModule())
             .build();

  @Test
  void serialize() throws Exception {

    final Document document = new Document(Code.RED);

    String xml = MAPPER.writeValueAsString(document);

    assertThat(xml).isEqualTo("<document><code>RED</code></document>");
  }

  @XmlRootElement(
    name = "document"
  )
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlType(
    propOrder = {"_code"}
  )
  public static class Document {

    @XmlElement(name = "code")
    private final Code _code;

    public Document(Code code) { _code = code; }

    public Code getCode() {
      return _code;
    }
  }

  @XmlEnum
  @XmlType(
    name = "CodeType"
  )
  @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
  public enum Code {

    @XmlEnumValue("RED")
    RED;
  }
}

The test was executed with jackson-module-jaxb-annotations-2.17.2.jar

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions