2012-03-26 3 views
1

Moxyを使用してSalesforceの送信メッセージXMLをマーシャリング/アンマーシャルする際に問題が発生します。私は取得しています例外は次のとおりです。DescriptorException EclipseLink JAXB(MOXy)を使用してXMLをアンマーシャリングする際の「データベース行のクラスインジケータフィールドが見つかりません」例外

javax.xml.bind.JAXBException 
- with linked exception: 
[Exception [EclipseLink-44] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: Missing class indicator field from database row [UnmarshalRecord()]. 
Descriptor: XMLDescriptor(service.salesforce.model.SObject --> [])] 

私が持っているクラスは次のとおりです。

@XmlSeeAlso({Account.class, Opportunity.class}) 
@XmlDiscriminatorNode("@type") 
public abstract class SObject { 
    public abstract String getId(); 
    public abstract void setId(String id); 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlDiscriminatorValue("sf:Opportunity") 
public class Opportunity extends SObject { 

    @XmlElement(name = "Id", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private String id; 

    @XmlElement(name = "AccountId", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private String accountId; 

    @XmlElement(name = "StageName", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private String stageName; 

    @XmlElement(name = "Agreement_Date_Signed__c", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private Date agreementDateSigned; 

    @XmlElement(name = "Agreement_Date_Start__c", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private Date agreementDateStart; 

    @XmlElement(name = "Payment_Method__c", namespace = "urn:sobject.enterprise.soap.sforce.com") 
    private String paymentMethod; 

    // getters and setters... 
} 

私は非整列化しようとしているXMLは次のとおりです。

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <out:notifications> 
     <out:OrganizationId>123456789123456789</out:OrganizationId> 
     <out:ActionId>123456789123456789</out:ActionId> 
     <out:SessionId>sessId</out:SessionId> 
     <out:EnterpriseUrl>http://www.enterpriseexample.com</out:EnterpriseUrl> 
     <out:PartnerUrl>http://www.partnerexample.com</out:PartnerUrl> 
     <out:Notification> 
      <out:Id>987654321987654321</out:Id> 
      <out:sObject xsi:type="sf:Opportunity" xmlns:sf="urn:sobject.enterprise.soap.sforce.com"> 
       <urn:Id>121212121212121212</urn:Id> 
       <urn:AccountId>121212121212121212</urn:AccountId> 
       <urn:Agreement_Date_Signed__c>2012-01-01T08:34:56Z</urn:Agreement_Date_Signed__c> 
       <urn:Agreement_Date_Start__c>2012-02-01</urn:Agreement_Date_Start__c> 
       <urn:StageName>Booking</urn:StageName> 
      </out:sObject> 
     </out:Notification> 
     </out:notifications> 
    </soapenv:Body> 
</soapenv:Envelope> 

任意のアイデア?

答えて

3

注:私はEclipseLink JAXB (MOXy)リードとJAXB 2 (JSR-222)専門家グループのメンバーです。

あなたの相続指標として、あなたの弁別ノードとしてxsi:type属性を使用しているので、私はむしろMOXYの@XmlDescriminatorNode/@XmlDescriminatorValue拡張よりも標準JAXBメカニズムを使用することをお勧めします。

SObjectの

package forum987537; 

import javax.xml.bind.annotation.XmlSeeAlso; 

@XmlSeeAlso({Account.class, Opportunity.class}) 
public abstract class SObject { 
    public abstract String getId(); 
    public abstract void setId(String id); 
} 

機会

package forum987537; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name="Opportunity") 
public class Opportunity extends SObject { 

    private String id; 

    @Override 
    public String getId() { 
     return id; 
    } 

    @Override 
    public void setId(String id) { 
     this.id = id; 
    } 

} 

通知

package forum987537; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Notification", namespace="http://soap.sforce.com/2005/09/outbound") 
public class Notification { 

    private SObject sObject; 

    @XmlElement(namespace="http://soap.sforce.com/2005/09/outbound") 
    public SObject getsObject() { 
     return sObject; 
    } 

    public void setsObject(SObject sObject) { 
     this.sObject = sObject; 
    } 

} 

パッケージ情報

@XmlSchema(
    namespace="urn:sobject.enterprise.soap.sforce.com", 
    elementFormDefault=XmlNsForm.QUALIFIED, 
    xmlns={ 
     @XmlNs(prefix="out", namespaceURI = "http://soap.sforce.com/2005/09/outbound"), 
     @XmlNs(prefix="sf", namespaceURI = "urn:sobject.enterprise.soap.sforce.com"), 
    }) 
package forum987537; 

import javax.xml.bind.annotation.*; 

デモ

package forum987537; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

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

     Notification notification = new Notification(); 
     Opportunity opportunity = new Opportunity(); 
     opportunity.setId("ABC123"); 
     notification.setsObject(opportunity); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(notification, System.out); 
    } 

} 

出力

<?xml version="1.0" encoding="UTF-8"?> 
<out:Notification xmlns:sf="urn:sobject.enterprise.soap.sforce.com" xmlns:out="http://soap.sforce.com/2005/09/outbound"> 
    <out:sObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="sf:Opportunity"> 
     <sf:id>ABC123</sf:id> 
    </out:sObject> 
</out:Notification> 

詳細情報

+0

私は 'SF使用する必要があります:' @のXmlType'名またはちょうど 'Opportunity'ためOpportunity'を?私は仕事用のコンピュータを持っていませんので、明日お試しになります – ryanprayogo

+0

それはうまくいかないようです。私はあなたが提案したものを試して、私はまだ同じ例外を取得しています。 – ryanprayogo

+0

@ryanprayogo - 私はより完全な例で私の答えを強化しました。私はこれが役立つことを願っています –

関連する問題