Если вам не нужно хотите повторно использовать JAXBContext, нет необходимости его создания. Существует метод удобства, который (почти) имеет подписи метода, который вы хотите. Он выбрасывает RuntimeException
(многие предпочитают это).
protected static <T> T unmarshall(String xml, Class<T> clazz) {
return JAXB.unmarshal(new StringReader(xml), clazz);
}
Но imo, просто используйте метод непосредственно без обертки.
Повторное использование JAXBContext делает (un) более ранним в долгосрочной перспективе. Еще одним улучшением является clazz.cast(), чтобы избежать неприятного непроверенного литья.
private static final ConcurrentMap<Class<?>, JAXBContext> CONTEXT = new ConcurrentHashMap<>();
protected static <T> T unmarshall(String xml, Class<T> clazz)
throws JAXBException {
JAXBContext context = CONTEXT.get(clazz);
if (context == null){
context = JAXBContext.newInstance(clazz);
CONTEXT.putIfAbsent(clazz, context);
}
Unmarshaller unmarshaller = context.createUnmarshaller();
Object obj = unmarshaller.unmarshal(new StringReader(xml));
if (clazz.isInstance(obj)){
return clazz.cast(obj);
}
throw new IllegalArgumentException("XML does not represent an instance of type:" + clazz.getName());
}
Спасибо за ввод! – Vel
SuppressWarnings - это быстрое и грязное обходное решение, которое скрывает ошибки программиста. Почему бы не использовать [typafe версию] (http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/Unmarshaller.html#unmarshal-javax.xml.transform.Source-java.lang .Class-) вместо: 'T obj = unmarshaller.unmarshal (новый StreamSource (новый StringReader (xml)), clazz) .getValue();' – VGR
@VGR, который привяжет класс к любому rootelement (игнорируя фактическое имя корневой элемент). Даже если в контексте есть лучшее совпадение. Лучше всего использовать clazz.isInstance() и clazz.cast(), чтобы избежать неконтролируемого приведения и обеспечить ожидаемый результат. –