Jakarta ee 在SOAP和JAX-WS之间丢失数据

Jakarta ee 在SOAP和JAX-WS之间丢失数据,jakarta-ee,soap,netbeans,jax-ws,Jakarta Ee,Soap,Netbeans,Jax Ws,在通过SOAP向web服务发送java对象时,我遇到了丢失数据的问题。我们有一个名为“User”的类,它有一个属于另一个名为“Company”的类的数据成员。它们都是使用java注释将XML绑定到SOAP的复杂类型。出于某种原因,当我尝试向web服务发送用户对象或从web服务发送用户对象时,它会丢失公司成员中的数据,只将该成员显示为空值。我使用了NetBeans调试器来确定公司对象在发送之前是否已填充,并使用NetBeans WS-tester来显示SOAP是否正确格式化了对象。因此,问题似乎在

在通过SOAP向web服务发送java对象时,我遇到了丢失数据的问题。我们有一个名为“User”的类,它有一个属于另一个名为“Company”的类的数据成员。它们都是使用java注释将XML绑定到SOAP的复杂类型。出于某种原因,当我尝试向web服务发送用户对象或从web服务发送用户对象时,它会丢失公司成员中的数据,只将该成员显示为空值。我使用了NetBeans调试器来确定公司对象在发送之前是否已填充,并使用NetBeans WS-tester来显示SOAP是否正确格式化了对象。因此,问题似乎在于Java的XML/SOAP到Java的转换

以下是SOAP响应:

Method returned
com.lingosys.attask.ws.User:“com.lingosys.attask.ws。User@6f863b" SOAP请求

<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org

/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header/>
        <S:Body>
            <ns2:getUser xmlns:ns2="http://ws.attask.lingosys.com/" xmlns:ns3="http://ws.fault.lingosys.com">
                <UserID>85967</UserID>
            </ns2:getUser>
        </S:Body>
    </S:Envelope>

SOAP Response

    <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header/>
        <S:Body>
            <ns2:getUserResponse xmlns:ns2="http://ws.attask.lingosys.com/" xmlns:ns3="http://ws.fault.lingosys.com">
                <return>
                    <id>85967</id>
                    <name>Mohamed Abdullahi, Ph.D.</name>
                    <address>P.O. Box 56046</address>
                    <address2>407 Laurier Ave. W.</address2>
                    <adminNotes/>
                    <agreements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    <altPhone1/>
                    <altPhone2/>
                    <certifications/>
                    <city>Ottawa</city>
                    <company>
                        <id>7029</id>
                        <name>Mohamed Abdullahi, Ph.D.</name>
                        <addPMSurchargeforDocTrans>true</addPMSurchargeforDocTrans>
                        <checkKnowledgeMgt>false</checkKnowledgeMgt>
                        <clientID>0</clientID>
                        <docTransPricingScheme>LLS Pricing</docTransPricingScheme>
                        <greatPlainsID/>
                        <guid>c71d4c279af611e287980019d15adc73</guid>
                        <legalEntity>Lingo Systems</legalEntity>
                        <passTradosLeveraging>false</passTradosLeveraging>
                        <paymentTerms>0</paymentTerms>
                        <usLinguistsRequired>false</usLinguistsRequired>
                        <userDataID/>
                    </company>
                    <copyedit>0.0</copyedit>
                    <country/>
                    <email>annie@goodie.com</email>
                    <email2>mdiriye@hotmail.com</email2>
                    <fax/>
                    <firstName>Mohamed</firstName>
                    <helpFuzzy>0.0</helpFuzzy>
                    <helpNew>0.0</helpNew>
                    <helpReps>0.0</helpReps>
                    <hourly>0.0</hourly>
                    <lastName>Abdullahi, Ph.D.</lastName>
                    <lingoNetUser>false</lingoNetUser>
                    <linguistSource>Coto DB</linguistSource>
                    <llsClientID/>
                    <medicalFuzzy>0.0</medicalFuzzy>
                    <medicalNew>0.0</medicalNew>
                    <medicalReps>0.0</medicalReps>
                    <memberships xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    <min>0.0</min>
                    <mktFuzzy>0.0</mktFuzzy>
                    <mktNew>0.0</mktNew>
                    <mktReps>0.0</mktReps>
                    <os/>
                    <pager/>
                    <phone/>
                    <pmComments/>
                    <postalCode>KIR 7Z0</postalCode>
                    <qualified xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    <roles>Linguist Account</roles>
                    <rushFuzzy>0.0</rushFuzzy>
                    <rushNew>0.0</rushNew>
                    <rushReps>0.0</rushReps>
                    <sourceLanguage>English (US)</sourceLanguage>
                    <specialties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    <state>ON</state>
                    <targetLanguage/>
                    <taxID/>
                    <techFuzzy>0.0</techFuzzy>
                    <techNew>0.0</techNew>
                    <techReps>0.0</techReps>
                    <timeZone>US/Eastern</timeZone>
                    <title/>
                    <tools xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                    <trFuzzy>0.0</trFuzzy>
                    <trNew>0.0</trNew>
                    <trReps>0.0</trReps>
                    <translatorSince/>
                    <trceFuzzy>0.0</trceFuzzy>
                    <trceNew>0.0</trceNew>
                    <trceReps>0.0</trceReps>
                    <uiFuzzy>0.0</uiFuzzy>
                    <uiNew>0.0</uiNew>
                    <uiReps>0.0</uiReps>
                    <userName>mdiriye@hotmail.com</userName>
                </return>
            </ns2:getUserResponse>
        </S:Body>
    </S:Envelope>

85967
SOAP响应
85967
穆罕默德·阿卜杜拉希博士。

如果您想查看soem代码或文档,请告诉我。有趣的是,这些Web服务的一个非常相似的版本,客户机在不同的环境中工作。我正在将表格NB6.9 Glassfish v2、JDK 1.6升级到NB7.3.1、GF4、JDK 1.7。对公司和用户类进行了一些代码更改,但我认为与SOAP无关


查看您在coderanch发布的代码,您会得到任何帮助:您的用户和公司类不是我所说的“jaxb编组友好型”。-)在这些“简单”的传输对象中有一大堆逻辑。您可能希望分离业务逻辑和传输表示。但这只是一个旁注

更重要的一点是,当您注释
私人公司时,服务器抛出了一个异常@xmlement
注释的code>。服务器开始抱怨元素的“双重”定义。我建议你

或者使用
@xmlacessortype(NONE)
注释传输对象(用户和公司)。这样,您就可以告诉JAXB不要封送任何未明确定义要封送的属性。然后用
@xmlement
@xmldattribute
注释两个类中要封送的每个属性

使用
@xmlacessortype(FIELD)
注释传输对象(用户和公司)。这将迫使JAXB根据类中定义的字段构建XML输出

我更喜欢第一个选项(代替重构整个类模型,只包含数据而不包含逻辑),因为它清楚地表明哪些字段被封送到XML,哪些字段没有


这有什么帮助吗?

好的,我终于弄明白了到底发生了什么,并想与大家分享一下。显然,JAX-WS或某些相关软件中潜入了一个bug,因此,如果属性的名称与其类的名称相同,则会导致Java在翻译时出现问题,即使属性以小写字母开头,而类名以大写字母开头。一旦我将用户类属性Company对象及其关联的getter和setter从“Company”更改为“userCompany”,问题就消失了。这个bug似乎是在JDK1.6的后期出现的。在JDK1.6.0_7、NB6.9和Glassfish V.2的旧环境下,这不是问题。然而,在新的NB 7.3.1和GF4下,即使我将NetBeans默认java平台的JDK设置为1.6.045,也出现了一个问题。

感谢您的帮助。你的答案听起来和我通过更改属性名找到并修复的一样。有机会我会试试你的解决办法。如果这也能奏效那就太好了。我想知道的一件事是您对引发异常的服务器的引用。使这个问题变得如此困难的原因之一是我没有看到任何例外。您是如何让服务器抛出异常的?我有点困惑。我同意您关于业务逻辑不在适当位置的看法。我使用@XmlAccessorType(FIELD)解决方案,因为它可以轻松地设置所有要跨越的字段,这就是最初的设计方式。使更改客户端应用程序中的setter/getter变得不必要。非常感谢您的帮助。您在Coderanch上发布的异常:
由以下原因引起:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:1个IllegalAnnotationExceptions类的计数有两个同名的属性“company”