Search code examples
javaspring-bootjaxbjava-17

How to extend glassfish jaxb NamespacePrefixMapper and set as a Marshaller property


I am using Spring boot 3 with Java 17 and setting the com.sun.xml.bind.namespacePrefixMapper property as below,

  final JAXBContext jaxbContext = JAXBContext.newInstance(t.getClass());
                final Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespacePrefixMapper());

MyNamespacePrefixMapper class looks like below,

import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper;

public class MyNamespacePrefixMapper extends NamespacePrefixMapper {

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {

        if (MyConstant.NAMESPACE_MY_SERVICE.equals(namespaceUri)) {
            return "tos";
        } 
        return suggestion;

    }
}

I have dependencies below,

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
</dependency>

I am getting a property exception saying, jakarta.xml.bind.PropertyException: name: com.sun.xml.bind.namespacePrefixMapper value: com.example.MyNamespacePrefixMapper@4bd4d5fa

What am i missing here?


Solution

  • The property name changed from "com.sun.xml.bind.namespacePrefixMapper" to org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl#PREFIX_MAPPER which equals "org.glassfish.jaxb.namespacePrefixMapper" in jaxb3 and jaxb4.

    Please use new value for property "org.glassfish.jaxb.namespacePrefixMapper" or associated constant.

    You can also try to use Namespace Prefix XJC Plugin in order to make it automatic from XSD to JAVA generation code.