java - JAXB 中不区分大小写的 XMLEnumValue

标签 java xml enums jaxb

JAXB 允许使用 @XMLEnum 从 XML 直接定位 Enum 实例。注解。
@XMLEnumValue 定位值时,JAXB 似乎区分大小写.

但是我面临一个问题,我需要以不区分大小写的方式定位 Enum 实例。 JAXB 是否以某种方式提供此功能?
没有这个,我只能手动定位 Enum 常量。

我可以用 XMLAdapter为此,但是为每个创建的枚举维护一个适配器变得非常繁琐。

编辑:

Why do you have to locate the enum in a case-insensitive manner?



因为我使用 xml 来读取我的系统的配置,并且我不希望用户被限制为固定大小写。我希望这能回答你的问题。
public class CaseInsensitiveEnumAdapter<E extends Enum<E>> extends XmlAdapter<String, E> {

    private final Class<E> clazz;

    public CaseInsensitiveEnumAdapter(Class<E> clazz) {
        this.clazz = clazz;
    }

    @Override
    public E unmarshal(String v) throws Exception {
        return Enum.<E>valueOf(clazz, v.toUpperCase().trim());
    }

    @Override
    public String marshal(E v) throws Exception {
        return v.name();
    }
}

因为我需要 .class对于枚举,我必须为所有枚举创建单独的适配器。

最佳答案

善良的纳伦德拉先生,

我想出了一个基于 的解决方案正则表达式 .
这个想法是使用 模式限制使用能够接受任何大小写组合的正则表达式。
我创建了一个枚举三种颜色的示例:绿色、红色和蓝色。
以下常规异常将接受“ GrEEn ”和“ gReeN ”文字作为有效值:

g|Gr|Re|Ee|En|N

在示例文件下:

示例 XML 架构
<xs:simpleType name="ColorType" final="restriction" >
    <xs:restriction base="xs:string">
        <xs:pattern value="g|Gr|Re|Ee|En|N" />
        <xs:pattern value="r|Re|Ed|D" />
        <xs:pattern value="b|Bl|Lu|Ue|E" />
    </xs:restriction>
</xs:simpleType>
<xs:element name="SomeElement">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Color" type="ColorType" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

XML 案例 1
<SomeElement>
    <Color>GreEN</Color>
</SomeElement>

XML 案例 2
<SomeElement>
    <Color>gREen</Color>
</SomeElement>

JUnit
public class TestJaxb {

    private static final String GREEN = "GREEN";

    @Test
    public void shouldParseCase1() throws JAXBException, MalformedURLException {
        URL xmlUrl = // Load XML file 1
        SomeElement someElement = parse(xmlUrl, SomeElement.class);
        assertEquals(GREEN, someElement.getColor().toUpperCase());
    }

    @Test
    public void shouldParseCase2() throws JAXBException, MalformedURLException {
        URL xmlUrl = // Load XML file 2
        SomeElement someElement = parse(xmlUrl, SomeElement.class);
        assertEquals(GREEN, someElement.getColor().toUpperCase());
    }

    private <T> T parse(URL url, Class<T> clazz) throws JAXBException {
        Unmarshaller unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller();
        return clazz.cast(unmarshaller.unmarshal(url));
    }
}

我意识到这使得 XSD 规范的用户更难以理解枚举中允许哪些值,但也许注释对你来说就足够了。

事实上,我发现没有其他方法可以在不实际更改 JAXB 代码的情况下实现这一点。

希望这可以帮助。

此致

关于java - JAXB 中不区分大小写的 XMLEnumValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010365/

相关文章:

java - 在通过方法调用创建的数组中打印位置 0

java - 有没有办法为多个 Runner 类运行的多个功能文件创建一个 Cucumber 报告?

java - 如何从 Java 代码向 Android 应用程序添加图像

java - 如何使用 Apache Camel XmlJsonDataFormat 编码将 XML 字符串转换为 JSON 字符串

c++ - 创建 std::vector 的枚举

java - Spring MVC - 将枚举填充到下拉列表

java - 如何以编程方式获取通过 Wifi 连接到交换机网络的其他设备的 IP 地址?

java - 获取 Pop3message 的负大小

java - Spring 集成 - 更少的样板?

c++ - 编译时检查字符串到枚举映射是否完整