2013-06-02 154 views
1

我有一個模型,包含一個具有一個註釋屬性的接口,以及一個不重新註釋該屬性實現的具體實現者。爲什麼這個解組不正確(使用MOXy 2.5.0)?我得到一個正確構造的對象,但物業從未綁定到XML:MOXy/JAXB接口註釋

<!-- XML --> 
<InterfaceImpl id="5150" /> 
/** 
* Annotated interface 
*/ 
@XmlRootElement(name="IInterface") 
public interface IInterface 
{ 
    @XmlAttribute(name="id") 
    public void setId(int id); 
} 

/** 
* Concrete implementor 
*/ 
@XmlRootElement(name="InterfaceImpl") 
public class InterfaceImpl implements IInterface 
{ 
    private int m_id = -1; 

    @Override 
    public void setId(int id) 
    { 
     m_id = id; 
    } 
} 

/** 
* Unmarshal code 
*/ 
File f = new File("src\\resources\\Interface.xml"); 
JAXBContext context = JAXBContext.newInstance(MY_PATH); 
Unmarshaller u = context.createUnmarshaller(); 
InterfaceImpl i = (InterfaceImpl)u.unmarshal(f);    

如果我改變IInterface到一個抽象類,它工作正常 - 不應該抽象類和接口被處理的同樣的方式?這是預期的行爲,還是已知的問題?

謝謝!

回答

1

oxm.xml

你可以使用的EclipseLink JAXB(莫西的)外部約束力的文件,以莫西認爲IInterface是超一流的,而不是InterfaceImplObject

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

演示

下面是創建JAXBContext時如何指定映射文件。對於這個演示的目的,我添加了一個getId方法到InterfaceImpl,所以我可以顯示解組工作。

package forum16878949; 

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

public class Demo { 

    private static String MY_PATH = "forum16878949"; 

    public static void main(String[] args) throws Exception { 
     /** 
     * Unmarshal code 
     */ 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum16878949/oxm.xml"); 
     File f = new File("src/forum16878949/Interface.xml"); 
     JAXBContext context = JAXBContext.newInstance(MY_PATH, IInterface.class.getClassLoader(), properties); 
     Unmarshaller u = context.createUnmarshaller(); 
     InterfaceImpl i = (InterfaceImpl)u.unmarshal(f); 
     System.out.println(i.getId()); 
    } 

} 

Interface.xml

<?xml version="1.0" encoding="UTF-8"?> 
<InterfaceImpl id="123"/> 

輸出

123 

更多信息

+0

感謝您的答覆,布萊斯 - 你是我想從聽到的傢伙。 :)所以這聽起來像我不應該期望它按照我想要的方式工作,也就是說,沒有辦法在事先不知道具體類型的情況下解組實現註釋接口的類。 –

+0

我不得不說,我仍然不清楚爲什麼一個接口的行爲與抽象類不一樣,我知道它們在語義上與JVM的角度「不同」,但我不明白爲什麼JAXB必須對待他們任何不同。您能否提供一些關於解組算法的深入見解,這可能會強調爲什麼這在技術上不可行? –

+0

@StephenCarlson - 我已經想出了一種方法來支持你的用例。我用一個完整的例子重新回答了我的答案。 –