Nar*_*hai 10 java xml enums jaxb
JAXB允许使用@XMLEnum注释直接从XML定位Enum实例.在定位值时,似乎JAXB区分大小写@XMLEnumValue.
但是我遇到了一个问题,我需要以不区分大小写的方式定位Enum实例.JAXB是否以某种方式提供此功能?没有这个,我被困在手动定位枚举常数.
我可以使用XMLAdapter它,但为每个创建的枚举维护适配器变得非常繁琐.
编辑:
为什么必须以不区分大小写的方式定位枚举?
因为我使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
因为我需要.class枚举,我将不得不为所有枚举创建单独的适配器.
亲切的纳伦德拉先生,
我想出了一个基于正则表达式的解决方案。这个想法是使用模式限制和能够接受任何大小写组合的正则表达式。我创建了一个枚举三种颜色的示例:绿色、红色和蓝色。以下常规异常将接受“ GrEEn ”和“ gReeN ”文字作为有效值:
g|Gr|Re|Ee|En|N
Run Code Online (Sandbox Code Playgroud)
在示例文件下:
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>
Run Code Online (Sandbox Code Playgroud)
XML案例1
<SomeElement>
<Color>GreEN</Color>
</SomeElement>
Run Code Online (Sandbox Code Playgroud)
XML案例2
<SomeElement>
<Color>gREen</Color>
</SomeElement>
Run Code Online (Sandbox Code Playgroud)
联合单元
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我意识到这使得 XSD 规范的用户更难理解枚举中允许哪些值,但也许注释对您来说就足够了。
事实上,我发现没有其他方法可以在不实际更改 JAXB 代码的情况下实现此目的。
希望这可以帮助。
此致
| 归档时间: |
|
| 查看次数: |
1653 次 |
| 最近记录: |