如何扩展 glassfish jaxb NamespacePrefixMapper 并设置为 Marshaller 属性

问题描述 投票:0回答:1

我将 Spring boot 3 与 Java 17 结合使用,并设置 com.sun.xml.bind.namespacePrefixMapper 属性,如下所示,

  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 类如下所示,

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;

    }
}

我有下面的依赖项,

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

我收到财产异常信息,

jakarta.xml.bind.PropertyException: name: com.sun.xml.bind.namespacePrefixMapper value: com.example.MyNamespacePrefixMapper@4bd4d5fa

我在这里缺少什么?

java spring-boot jakarta-ee jaxb java-17
1个回答
0
投票

属性名称从

"com.sun.xml.bind.namespacePrefixMapper"
更改为
org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl#PREFIX_MAPPER
,相当于 jaxb3 和 jaxb4 中的
"org.glassfish.jaxb.namespacePrefixMapper"

请使用属性

"org.glassfish.jaxb.namespacePrefixMapper"
或关联常量的新值。

您还可以尝试使用 Namespace Prefix XJC Plugin 以便自动从 XSD 生成 JAVA 代码。

© www.soinside.com 2019 - 2024. All rights reserved.