gpt4 book ai didi

java - jaxb 隐藏枚举值

转载 作者:行者123 更新时间:2023-11-30 11:45:48 27 4
gpt4 key购买 nike

是否有 JAXB 注释允许我们使用枚举隐藏某些值?

例如,如果我想在以下枚举中隐藏值 BLUE:

public enum COLOR {
RED,
YELLOW,
GREEN,
@SomeAnnotation
BLUE
}

有没有办法按照规范执行此操作?

编辑:一些评论者提到这样做没有意义。我(恭敬地)不同意。在 JAXB/Web 服务领域有这方面的先例。这是我正在考虑的情况:

使用 Java 优先 Web 服务设计,类和枚举直接转换为 XSD 并通过 Web 服务公开。现在可能存在我们希望从 Web 服务中隐藏某些(敏感?)数据的情况,但让库可以直接访问代码。对于类字段,JAXB 提供了一个 @XmlTransient 注释来隐藏不应通过 Web 服务公开的字段 - 仅此而已,对于枚举值也存在这种需求。

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB 2 (JSR-222) 的领导和成员专家组。

以下示例与 EclipseLink JAXB (MOXy) 一起使用,但在我使用的 JDK (Oracle JDK 1.6.0_29) 中包含的 JAXB 版本似乎会引发异常。

颜色适配器

我使用 XmlAdapterenum 值转换为 String。如果值为 BLUE,则我返回 null 作为 String 值。这将导致 JAXB 不编码相应的节点。

package forum10192641;

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

public class COLORAdapter extends XmlAdapter<String, COLOR> {

@Override
public COLOR unmarshal(String v) throws Exception {
return COLOR.valueOf(v);
}

@Override
public String marshal(COLOR v) throws Exception {
if(v == COLOR.BLUE) {
return null;
}
return v.name();
}

}

颜色

XmlAdapter 是使用 @XmlJavaTypeAdapter 注释注册的。如果您希望适配器应用于 COLOR 的所有实例,那么您可以在 COLOR 枚举本身上指定适配器。

package forum10192641;

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

@XmlJavaTypeAdapter(COLORAdapter.class)
public enum COLOR {
RED,
YELLOW,
GREEN,
BLUE
}

下面是一个域类,具有三个类型为 COLOR 的属性:

package forum10192641;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

private COLOR color1;
private COLOR color2;
private COLOR color3;

public COLOR getColor1() {
return color1;
}

public void setColor1(COLOR color1) {
this.color1 = color1;
}

public COLOR getColor2() {
return color2;
}

public void setColor2(COLOR color2) {
this.color2 = color2;
}

public COLOR getColor3() {
return color3;
}

public void setColor3(COLOR color3) {
this.color3 = color3;
}

}

jaxb.properties

将 MOXy 指定为您的 JAXB 提供程序,您需要在与域模型相同的包中包含一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

演示

package forum10192641;

import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

Foo foo = new Foo();
foo.setColor1(COLOR.GREEN);
foo.setColor2(COLOR.BLUE);
foo.setColor3(COLOR.RED);
marshaller.marshal(foo, System.out);
}

}

输出

下面是运行演示代码的输出。

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<color1>GREEN</color1>
<color3>RED</color3>
</foo>

关于java - jaxb 隐藏枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com