我正在编写代码以从文件中解组XML。我不知道XML是基于哪个架构的,因此我尝试使用几种Jaxb2Marshaller实例形式的架构来解组XML。
该方法需要:
这是当前代码:
id
我觉得这种方法在不同的抽象级别上做太多事情:
但是我没有一种简化它的方法。每个编组器都需要try-catch块(因为我应该捕获并忽略除最后一个之外的这些XmlMappingExceptions)。该块要么返回结果对象,要么返回lastErrorMessage,这是迭代下面抛出MyException所需要的。
我能想到的唯一解决方案是创建一个人为的Result类,其中包含结果对象或错误消息,但感觉很笨拙。还有其他见解吗?
答案 0 :(得分:0)
我想要具有以下粒度的方法:
private Object getObject(byte[] data) throws MyException {
Result result;
for (Jaxb2Marshaller marshaller : this.marshallers) {
result = getObject(marshaller, data);
}
return handleError(result);
}
private Result getObject(Jaxb2Marshaller marshaller, byte[] data) {
try {
return Result.value(marshaller.unmarshal(new StreamSource(new ByteArrayInputStream(data))));
} catch (final XmlMappingException e) {
LOGGER.warn("Invalid XML", e);
return Result.error(e.getMessage());
}
}
private Object handleError(Result result) {
if (result.isError()) {
throw new MyException(result.errroMessage);
}
else {
return result.value;
}
}
但是附加的Result类很冗长又笨拙:
private class Result {
String errorMessage;
Object value;
static Result error(String errorMessage) {
Result result = new Result();
result.errorMessage = errorMessage;
return result;
}
static Result value(Object value) {
Result result = new Result();
result.value = value;
return result;
}
boolean isError() {
return errorMessage != null;
}
}