gpt4 book ai didi

web-services - 在执行 JAXB 解码时处理无效的枚举值

转载 作者:行者123 更新时间:2023-12-04 02:42:00 24 4
gpt4 key购买 nike

我的 Jaxb 创建了一个基于 XML 模式设置的 Enum 类。

**enum Fruit {
APPLE,ORANGE;
}**

我正在使用 SOAP UI 来检查我的 Web 服务。由于它是自由形式的条目,如果我给出错误的水果,请说 “古瓦”然后不是抛出异常,而是在执行 UnMarshalling 后将其返回为 null。

我怎样才能避免这种情况?我应该使用自定义枚举类而不是 JAXB 生成的一个。请举一些例子。即

问候
斯里兰卡

最佳答案

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

默认情况下,您的 JAXB (JSR-222) 实现不会因任何转换异常而失败。如果您使用 JAXB API 进行解码,那么您可以设置 ValidationEventHandler捕获任何问题。下面是一个例子。


package forum12147306;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root {

private int number;
private Fruit fruit;

public int getNumber() {
return number;
}

public void setNumber(int number) {
this.number = number;
}

public Fruit getFruit() {
return fruit;
}

public void setFruit(Fruit fruit) {
this.fruit = fruit;
}

}

水果
package forum12147306;

public enum Fruit {

APPLE,
ORANGE;

}

演示
package forum12147306;

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

private static final String XML = "<root><number>ABC</number><fruit>Guva</fruit></root>";
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setEventHandler(new ValidationEventHandler() {

@Override
public boolean handleEvent(ValidationEvent validationEvent) {
System.out.println(validationEvent.getMessage());
//validationEvent.getLinkedException().printStackTrace();
return true;
}

});

Root root = (Root) unmarshaller.unmarshal(new StringReader(XML));
}

}

JAXB 引用实现

不幸的是,JAXB RI 中似乎存在一个错误,因为无效的枚举值没有通过验证事件。
Not a number: ABC

解决

自己写 XmlAdapter处理到/从 Fruit 的转换枚举:

FruitAdapter
package forum12147306;

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

public class FruitAdapter extends XmlAdapter<String, Fruit> {

@Override
public String marshal(Fruit fruit) throws Exception {
return fruit.name();
}

@Override
public Fruit unmarshal(String string) throws Exception {
try {
return Fruit.valueOf(string);
} catch(Exception e) {
throw new JAXBException(e);
}
}

}

水果

使用 @XmlJavaTypeAdapter用于关联 XmlAdapter 的注释与 Fruit NumPy 。
package forum12147306;

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

@XmlJavaTypeAdapter(FruitAdapter.class)
public enum Fruit {

APPLE,
ORANGE;

}

新输出
Not a number: ABC
javax.xml.bind.JAXBException
- with linked exception:
[java.lang.IllegalArgumentException: No enum const class forum12147306.Fruit.Guva]

EclipseLink JAXB (MOXy)

使用 MOXy 会抛出两个验证事件。要将 MOXy 指定为您的 JAXB 提供程序,请参阅: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html .
Exception Description: The object [ABC], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[number-->number/text()]] with descriptor [XMLDescriptor(forum12147306.Root --> [DatabaseTable(root)])], could not be converted to [class java.lang.Integer].
Internal Exception: java.lang.NumberFormatException: For input string: "ABC"

Exception Description: No conversion value provided for the value [Guva] in field [fruit/text()].
Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[fruit-->fruit/text()]
Descriptor: XMLDescriptor(forum12147306.Root --> [DatabaseTable(root)])

关于web-services - 在执行 JAXB 解码时处理无效的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147306/

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