2013-07-01 2 views
2

Xml переходных аннотаций не работает для следующих модельноXml переходный не работает jaxb (Moxy).?

@XmlRootElement 
public class JdfValidation { 
private String name; 
private String dataType; 
private String errorMessage; 
private String javaValidationLogic; 
protected String displayName; 
private boolean isCustom; 
private List<ValidationInputParam> validationInputParams = new ArrayList<ValidationInputParam>(); 
public IFile container; 

public JdfValidation() { 

} 

public JdfValidation(String name, String displayName, boolean isCustom) { 
    this.name = name; 
    this.displayName = displayName; 
    this.isCustom = isCustom; 
} 

@XmlTransient 
public IFile getContainer() { 
    return container; 
} 

public void setContainer(IFile container) { 
    this.container = container; 
} 

/** 
* @return the validationInputParams 
*/ 
@XmlElement 
public List<ValidationInputParam> getValidationInputParams() { 
    return validationInputParams; 
} 

/** 
* @param validationInputParams 
*   the validationInputParams to set 
*/ 
public void setValidationInputParams(
     List<ValidationInputParam> validationInputParams) { 
    this.validationInputParams = validationInputParams; 
} 

@XmlAttribute 
public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@XmlAttribute 
public String getDataType() { 
    return dataType; 
} 

public void setDataType(String dataType) { 
    this.dataType = dataType; 
} 

@XmlAttribute 
public String getErrorMessage() { 
    return errorMessage; 
} 

public void setErrorMessage(String errorMessage) { 
    this.errorMessage = errorMessage; 
} 

@XmlElement(name = "logic") 
public String getJavaValidationLogic() { 
    return javaValidationLogic; 
} 

public void setJavaValidationLogic(String javaValidationLogic) { 
    this.javaValidationLogic = javaValidationLogic; 
} 

@XmlAttribute 
public String getDisplayName() { 
    return displayName; 
} 

public void setDisplayName(String displayName) { 
    this.displayName = displayName; 
} 

@XmlAttribute 
public boolean isCustom() { 
    return isCustom; 
} 

public void setCustom(boolean isCustom) { 
    this.isCustom = isCustom; 
} 

}

Я также попытался @XmlAccessorType (XmlAccessType.NONE) бушелей еще же исключение, выше работает с JAXB по умолчанию implementation.Plz, помощь.

Вызванный: Exception [EclipseLink-50089] (Eclipse, Постоянство услуги - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.JAXBException Исключение Описание: Java интерфейс org.eclipse.core .resources.IFile не может быть сопоставлен JAXB, поскольку он имеет несколько отображаемых родительских интерфейсов. Многократное Наследование не поддерживается

ответ

1

UPDATE

Мы исправили ошибку, за этим вопросом (см: http://bugs.eclipse.org/411993) будет доступен в EclipseLink 2.5.1 и 2.6.0 потоков, начиная с июля 4, 2013. Вы можете скачать ночную сборку по следующей ссылке:


ВЫПУСК

Там, кажется, ошибка при Moxy рассказан (с @XmlTransient) игнорировать свойство, если тип представляет собой интерфейс с несколькими супер интерфейсами.

1 Супер интерфейс - Работает

public interface IFile extends IFoo { 

} 

Более 1 Супер-интерфейс - не работает

public interface IFile extends IFoo, IBar { 

} 

Вы можете использовать следующую ошибку, чтобы отслеживать наш прогресс в этом вопросе ,


РЕШЕНИЕ

Вы можете использовать внешнее отображение документа Moxy, чтобы переопределить надтипа IFile, чтобы сделать ваш случай использования работы (см: http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html):

oxm.XML

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum17399333"> 
    <java-types> 
     <java-type name="IFile" super-type="java.lang.Object"/> 
    </java-types> 
</xml-bindings> 

Demo

import java.util.*; 
import javax.xml.bind.JAXBContext; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum17399333/oxm.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {JdfValidation.class}, properties); 
    } 

} 
0

Другая работа вокруг может быть -

@XmlRootElement(name = "Validator") 
public class JdfValidation { 


private Object container; //Cast this to appropriate type 

@Transient 
public Object getContainer() { 
    return container; 
} 

public void setContainer(Object container) { 
    this.container = container; 
} 
} 

Демо

public class Demo { 

public static void main(String[] args) throws Exception { 
    JAXBContext jc = JAXBContext.newInstance(JdfValidation.class); 

    JdfValidation jdfValidation = new JdfValidation(); 
      IFile file=getFile(); 
      jdfValidation.setContainer(file); 
      Marshaller marshaller = jc.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(jdfValidation, System.out); 
} 

    } 
Смежные вопросы