2015-11-19 2 views
0

Я следую за потоками, связанными с JAXB Marshalling/Unmarshalling некоторое время.java.lang.NoSuchMethodException: JAXB Unmarshalling Interfaces

У меня возникли проблемы, когда я пытался преобразовать объект Java в XML, в котором были некоторые интерфейсы. Позже я узнал, что это можно решить с помощью Mxy EclipseLink. @ Статьи Bdoughan здесь http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html и ответы были очень полезными. Но теперь у меня проблемы, когда я пытаюсь развязать тот же XML-файл, сгенерированный обратно в объекты Java.

Это интерфейс.

public interface TimePeriod extends Serializable{ 

/** 
* Return the end Time of the Time Period 
*/ 
public Date getEndDate(); 

/** 
* Return the startTime of the Time Period 
*/ 
public Date getStartDate(); 

/** 
* Sets the startTime of the Time period 
*/ 
public void setStartDate(Date newStartDate); 

/** 
* Sets the endTime of the Time period 
*/ 
public void setEndDate(Date newEndDate); 

} 

Один из Реализации

TaskStepTimePeriod

public class TaskStepTimePeriod implements TimePeriod { 

private Date taskStartDate; 
private Date taskEndDate; 

@Override 
public Date getEndDate() { 
    return taskEndDate; 
} 

@Override 
public Date getStartDate() { 
    return taskStartDate; 
} 


public void setTaskStartDate(Date newVal) { 
    this.taskStartDate = newVal; 
} 


public void setTaskEndDate(Date newVal) { 
    this.taskEndDate = newVal; 
} 

@Override 
public void setStartDate(Date newStartDate) { 
    this.taskStartDate = newStartDate; 
} 

@Override 
public void setEndDate(Date newEndDate) { 
    this.taskEndDate = newEndDate; 
} 

} 

выстроил XML

<?xml version="1.0" encoding="UTF-8"?> 
<plannedProgram> 
    <taskStep> 
    <endDate>2014-07-31T12:00:00.262+05:30</endDate> 
    <startDate>2014-06-01T12:00:00.262+05:30</startDate> 
    </taskStep> 
</plannedProgram> 

Так что, когда я пытаюсь маршализацию, я получаю эту ошибку StackTrace ..

Exception in thread "main" Local Exception Stack: 
    Exception [EclipseLink-63] (Eclipse Persistence Services -  2.6.1.v20150916-55dc7c3):  org.eclipse.persistence.exceptions.DescriptorException 
    Exception Description: The instance creation method  [com.cts.axb.model.TimePeriod.<Default Constructor>], with no parameters, does not exist, or is not accessible. 
    Internal Exception: java.lang.NoSuchMethodException: com.cts.axb.model.TimePeriod.<init>() 
    Descriptor: XMLDescriptor(com.cts.axb.model.TimePeriod --> []) 

В нем нет конструктора по умолчанию, но в интерфейсе? Было бы очень полезно понять, что я сделал неправильно?

Я пропустил аннотирование любых элементов в классах?

My Unmarshalling code.!

try { 
     context = JAXBContext.newInstance(PlannedProgram.class);  
     Unmarshaller jaxbUnmarshaller = context.createUnmarshaller(); 
     newMaintProg = (PlannedProgram) jaxbUnmarshaller.unmarshal(file); 
     System.err.println("XML file succesffuly read"); 
    } catch (JAXBException e) { 
     System.err.println("Error Reading/Unmarshalling the XML file "+ e);   
    } 

ответ

1

См. https://jaxb.java.net/guide/Mapping_interfaces.html. Разделы 3.2.2 и 3.2.3 являются наиболее актуальными.

Возможно, вы можете указать конкретный тип в PlannedProgram, например.

private TaskStepTimePeriod taskStep; 
+0

Я не могу добавлять/удалять поля в основной модели PlannedProgram. Я собираюсь попробовать метод XMLAdapter в указанных вами ссылках! – Napster

+0

Ну, это работало как реализация, упомянутая в 3.2.2, теперь я получаю ** null **, когда я отменяю эти значения даты. – Napster