Right, indeed, Aegis does \something/, and any other kit will consume the resulting XML Schema, we hope. But this only helps if you are willing to supplement or replace all your @'s with .aegis.xml files.
> -----Original Message----- > From: kayteeem [mailto:[EMAIL PROTECTED] > Sent: Tuesday, September 18, 2007 8:41 PM > To: cxf-user@incubator.apache.org > Subject: RE: Map contains no data when returned from remote call - Aegis > databinding - empty Map? > > > Thanks for the reply. > > Yes JaxB definitely has issues with returning java.util.Map type. > According to the Aegis databinding docs: > it supports Maps, but doesn't seem to be working. > > "Aegis Supported Types" > > * Basic types: int, double, float, long, byte[], short, String, > BigDecimal > * Arrays > * Collections - including Maps > * Dates: java.util.Date, java.util.Calendar, java.sql.Timestamp, > java.sql.Date, java.sql.Time > * XML: org.w3c.dom.Docmument, org.jdom.Element, XMLStreamReader, > Source > * Complex types which are aggregations of the above > > Ref: http://cwiki.apache.org/CXF20DOC/aegis-databinding.html > > bmargulies wrote: > > > > There is a complex question about how a Map can be represented in XML > > Schema. As I recall, in JAXB, the rather complex annotation for the > > purpose is only in 2.1, which CXF doesn't do yet. We switched from a Map > > to an explicit data structure to get around this. > > > >> -----Original Message----- > >> From: kayteeem [mailto:[EMAIL PROTECTED] > >> Sent: Tuesday, September 18, 2007 8:11 PM > >> To: cxf-user@incubator.apache.org > >> Subject: Re: Map contains no data when returned from remote call - > > Aegis > >> databinding - empty Map? > >> > >> > >> Searching through the forum, it seems that no-one else seems to have > >> issues > >> with returning java.util.Map. > >> Is this true? Is anyone returning a Map from CXF with no issues? > >> > >> I think this is a known issue with BEA Weblogic 9.2 then, from there > > web > >> site: > >> > >> "Weblogic Workshop 8.1 supported returning the java.util.Map type from > > Web > >> Service operations. The runtime provided a Workshop specific > > serialization > >> of the Map to and from XML. The schema for that serialization was > > included > >> in the WSDL for the Web Service. > >> > >> In WebLogic Server 9.2, the java.util.Map type can no longer be > > returned > >> from Web Service operations. > >> Workaround or Solution: > >> Provide an application-defined type that supports the key/value > > features > >> provided by java.util.Map. That type must conform to JAX/RPC > > Java<->XML > >> Serialization rules. If the application-type is going to contain > >> subclasses > >> of type key or value type, then the weblogic.jws.Types annotation must > > be > >> used to specify the types that could be contained at runtime. WebLogic > > Web > >> Services (and their clients) that previously returned a java.util.Map > > will > >> have to be manually updated to use this new application-defined type. > >> " > >> Ref: > > http://e-docs.bea.com/wls/docs92/issues/known_resolved.html#wp1118161 > >> > >> Thanks Michael > >> > >> > >> kayteeem wrote: > >> > > >> > Hi all, > >> > > >> > I cant return a simple java.util.Map from a Remote Service call. The > >> > implementation class on the remote end is java.util.HashMap. > >> > Once the data is returned on the caller, the Map contains data in > > the > >> SOAP > >> > message (included below for String->String Map, and > > String->AccountBO > >> > also), but once unmarshalled into a Java object, it has a size = 0 > > (No > >> > entries in the Map). > >> > > >> > I must have missed some simple configuration of some sort, since I > > have > >> > switched the databinding to Aegis, and according to Aegis > > documentation > >> it > >> > supports Maps. > >> > Any Help would be much appreciated. > >> > > >> > "Aegis Supported Types" > >> > > >> > * Basic types: int, double, float, long, byte[], short, String, > >> > BigDecimal > >> > * Arrays > >> > * Collections - including Maps > >> > * Dates: java.util.Date, java.util.Calendar, java.sql.Timestamp, > >> > java.sql.Date, java.sql.Time > >> > * XML: org.w3c.dom.Docmument, org.jdom.Element, XMLStreamReader, > >> > Source > >> > * Complex types which are aggregations of the above > >> > > >> > Ref: http://cwiki.apache.org/CXF20DOC/aegis-databinding.html > >> > > >> > Calling any of the Service methods below that return Map always seem > > to > >> be > >> > unmarshalled into an empty java object, even though I can see the > > data > >> > inside the SOAP message once returned on the calling/requestor side. > >> > > >> > In the returned SOAP message why does it contain a reference to the > >> > Complex object(AccountBO) eg) > >> [EMAIL PROTECTED] > >> > and not the marshalled data into XML. If I returned a java.util.List > > it > >> > marshalls the values inside AccountBO into XML data containing the > >> values > >> > inside each AccountBO object. > >> > > >> > Details of the implementation: > >> > CXF 2.0.1 > >> > Spring 2.0.4 > >> > Weblogic BEA 9.2 AppServer > >> > JDK 1.5 using Generics ( I even tried with explicit Aegis Mapping > > file > >> for > >> > JDK1.4, but to no avail. > >> > Ref:http://xfire.codehaus.org/Mapping+collections) > >> > > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > // Service Interface: AccountService.java: > >> > > >> > > >> > @WebService > >> > public interface AccountService { > >> > > >> > /** > >> > * Gets a Map of all the accounts > >> > * > >> > * @return the id of the Map is the accountId, value is the > >> > account(AccountBO) > >> > */ > >> > @WebMethod > >> > public Map<String, AccountBO> getAccounts(); > >> > > >> > @WebMethod > >> > public Map<String, String> getMapOfStrings(); > >> > } > >> > > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > // Service Implementation - AccountServiceImpl .java: > >> > > >> > @WebService(endpointInterface = > >> > "com.axa.demo.ws.shared.service.AccountService") > >> > public class AccountServiceImpl implements AccountService, > > Serializable > >> { > >> > > >> > // list of Accounts > >> > Map<String, AccountBO> accounts = new HashMap<String, > > AccountBO>(); > >> > > >> > List<AccountBO> theList = new ArrayList<AccountBO>(); > >> > > >> > Map<String, String> mapOfStrings = new HashMap<String, > > String>(); > >> > > >> > private static final long serialVersionUID = 1L; > >> > > >> > public AccountServiceImpl(){ > >> > mapOfStrings.put("One", "Michael"); > >> > mapOfStrings.put("Two", "Paul"); > >> > > >> > AccountBO acct1 = new AccountBO(); > >> > acct1.setAccountId("acct_1"); > >> > > >> > AccountBO acct2 = new AccountBO(); > >> > acct2.setAccountId("acct_2"); > >> > > >> > accounts.put("acct_1", acct1); > >> > accounts.put("acct_2", acct2); > >> > > >> > } > >> > > >> > public java.util.Map<String, AccountBO> getAccounts() { > >> > return accounts; > >> > } > >> > > >> > public Map<String, String> getMapOfStrings(){ > >> > return mapOfStrings ; > >> > } > >> > > >> > } > >> > > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > Spring config Client proxy side > >> > > >> > <beans xmlns="http://www.springframework.org/schema/beans" > >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > >> > xmlns:aop="http://www.springframework.org/schema/aop" > >> > xmlns:jaxws="http://cxf.apache.org/jaxws" > >> > xsi:schemaLocation=" > >> > http://www.springframework.org/schema/beans > >> > http://www.springframework.org/schema/beans/spring-beans.xsd > >> > http://www.springframework.org/schema/aop > >> > http://www.springframework.org/schema/aop/spring-aop-2.0.xsd > >> > http://cxf.apache.org/jaxws > > http://cxf.apache.org/schemas/jaxws.xsd"> > >> > > >> > <import resource="classpath:META-INF/cxf/cxf.xml" /> > >> > <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" > > /> > >> > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> > >> > > >> > <!-- Aegis data binding > >> > <bean id="aegisDatabinding" > >> > > >> class="org.apache.cxf.aegis.databinding.AegisDatabinding"/> > >> > > >> > <!-- Definition of AccountService client bean --> > >> > <bean id="services.appln.accountClient" > >> > class="com.axa.demo.ws.shared.service.AccountService" > >> > factory-bean="accountClientFactory" factory-method="create"/> > >> > > >> > <bean id="accountClientFactory" > >> > class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> > >> > <property name="serviceClass" > >> > value="com.axa.demo.ws.shared.service.AccountService"/> > >> > <property name="address" > >> > value="http://localhost:7001/demoWeb/ws/AccountService"/> > >> > <property name="dataBinding" ref="aegisDatabinding"/> > >> > > >> > </bean> > >> > > >> > </beans> > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > Spring config Remote Service side > >> > > >> > <beans xmlns="http://www.springframework.org/schema/beans" > >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > >> > xmlns:jaxws="http://cxf.apache.org/jaxws" > >> > xsi:schemaLocation=" > >> > http://www.springframework.org/schema/beans > >> > http://www.springframework.org/schema/beans/spring-beans-2.0.xsd > >> > http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd > >> > http://www.springframework.org/schema/aop > >> > http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" > >> >> > >> > > >> > <import resource="classpath:META-INF/cxf/cxf.xml" /> > >> > <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" > > /> > >> > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> > >> > > >> > <!-- Aegis databinding --> > >> > <bean id="aegisBean" > >> > class="org.apache.cxf.aegis.databinding.AegisDatabinding"/> > >> > <bean id='jaxws-and-aegis-service-factory' > >> > class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"> > >> > <property name="dataBinding" ref="aegisBean"/> > >> > <property name="serviceConfigurations"> > >> > <list> > >> > <bean > >> > class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/> > >> > <bean > >> > class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/> > >> > <bean > >> > class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/> > >> > </list> > >> > </property> > >> > </bean> > >> > > >> > <!-- AccountService Implementation --> > >> > <jaxws:endpoint id="accountService" address="/AccountService"> > >> > <jaxws:implementor> > >> > <bean > >> class="com.axa.demo.ws.service.impl.AccountServiceImpl"/> > >> > </jaxws:implementor> > >> > > >> > <jaxws:serviceFactory> > >> > <ref bean='jaxws-and-aegis-service-factory' /> > >> > </jaxws:serviceFactory> > >> > > >> > </jaxws:endpoint> > >> > > >> > <!-- The stuff below enables logging of the SOAP messages to the > >> > console --> > >> > <bean id="logInbound" > >> > class="org.apache.cxf.interceptor.LoggingInInterceptor"/> > >> > <bean id="logOutbound" > >> > class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> > >> > <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl"> > >> > <property name="inInterceptors"> > >> > <list> > >> > <ref bean="logInbound"/> > >> > </list> > >> > </property> > >> > <property name="outInterceptors"> > >> > <list> > >> > <ref bean="logOutbound"/> > >> > <ref bean="interceptor.webservices.out.security"/> > >> > </list> > >> > </property> > >> > <property name="outFaultInterceptors"> > >> > <list> > >> > <ref bean="logOutbound"/> > >> > </list> > >> > </property> > >> > </bean> > >> > > >> > </beans> > >> > > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > // AccountBO.java > >> > public class AccountBO implements Serializable{ > >> > > >> > /** > >> > * > >> > */ > >> > private static final long serialVersionUID = > > 273699541584709071L; > >> > > >> > private String accountId; > >> > private String accountType; > >> > private int balance = 0; > >> > > >> > public String getAccountType() { > >> > return accountType; > >> > } > >> > public void setAccountType(String accountType) { > >> > this.accountType = accountType; > >> > } > >> > public int getBalance() { > >> > return balance; > >> > } > >> > public void setBalance(int balance) { > >> > this.balance = balance; > >> > } > >> > public String getAccountId() { > >> > return accountId; > >> > } > >> > public void setAccountId(String accountId) { > >> > this.accountId = accountId; > >> > } > >> > > >> > } > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > SOAP Messages received back from remote call to AccountService > >> > public Map<String, String> getMapOfStrings(); > >> > > >> > INFO: Outbound Message > >> > -------------------------------------- > >> > <soap:Envelope > >> > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body > >> >><ns1:getMapOfStringsResponse > >> xmlns:ns1="http://service.shared.ws.demo.axa.com/" > >> >><return><entry > >> xmlns="http://impl.service.ws.demo.axa.com/"><key>Two</key><valu > >> > e>Paul</value></entry><entry > >> > xmlns="http://impl.service.ws.demo.axa.com/"><key>O > >> > > >> > > ne</key><value>Michael</value></entry></return></ns1:getMapOfStringsResp > > on > >> se></s > >> > oap:Body></soap:Envelope> > >> > -------------------------------------- > >> > 18/09/2007 14:44:15 org.apache.cxf.interceptor.LoggingInInterceptor > >> > handleMessag > >> > e > >> > INFO: Inbound Message > >> > -------------------------------------- > >> > <soap:Envelope > >> > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body > >> >><ns1:getMapOfStringsResponse > >> xmlns:ns1="http://service.shared.ws.demo.axa.com/" > >> >><return><entry > >> xmlns="http://impl.service.ws.demo.axa.com/"><key>Two</key><valu > >> > e>Paul</value></entry><entry > >> > xmlns="http://impl.service.ws.demo.axa.com/"><key>O > >> > > >> > > ne</key><value>Michael</value></entry></return></ns1:getMapOfStringsResp > > on > >> se></s > >> > oap:Body></soap:Envelope> > >> > -------------------------------------- > >> > <18/09/2007 02:44:15 PM EST> <DEBUG> <demoEAR_demoWeb> <pc33326> > >> > <AdminServer> < > >> >> <demo> > >> >> > > <portlets.coreFramework.remotingAccount.RemotingAccountController.getMa > >> > pOfStringsAction(RemotingAccountController.java:121)> - Map Of > > Strings > >> > size = 0 > >> > > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > > ************************************************************************ > > ** > >> ****** > >> > > >> > SOAP Messages received back from remote call to AccountService > >> > public Map<String, AccountBO> getAccounts(); > >> > > >> > INFO: Outbound Message > >> > -------------------------------------- > >> > <soap:Envelope > >> > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body > >> >><ns1:getAccountsResponse > >> xmlns:ns1="http://service.shared.ws.demo.axa.com/"><re > >> > turn><entry > >> > xmlns="http://impl.service.ws.demo.axa.com/"><key>acct_2</key><value > >> >>[EMAIL PROTECTED]</value></entry><entry > >> xmlns="http:/ > >> > > >> > > /impl.service.ws.demo.axa.com/"><key>acct_1</key><value>com.axa.demo.ws. > > sh > >> ared.b > >> > > >> > > [EMAIL PROTECTED]</value></entry></return></ns1:getAccountsResponse></ > > so > >> ap:Bod > >> > y></soap:Envelope> > >> > -------------------------------------- > >> > 18/09/2007 14:50:18 org.apache.cxf.interceptor.LoggingInInterceptor > >> > handleMessag > >> > e > >> > INFO: Inbound Message > >> > -------------------------------------- > >> > <soap:Envelope > >> > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body > >> >><ns1:getAccountsResponse > >> xmlns:ns1="http://service.shared.ws.demo.axa.com/"><re > >> > turn><entry > >> > xmlns="http://impl.service.ws.demo.axa.com/"><key>acct_2</key><value > >> >>[EMAIL PROTECTED]</value></entry><entry > >> xmlns="http:/ > >> > > >> > > /impl.service.ws.demo.axa.com/"><key>acct_1</key><value>com.axa.demo.ws. > > sh > >> ared.b > >> > > >> > > [EMAIL PROTECTED]</value></entry></return></ns1:getAccountsResponse></ > > so > >> ap:Bod > >> > y></soap:Envelope> > >> > -------------------------------------- > >> > <18/09/2007 02:50:18 PM EST> <DEBUG> <demoEAR_demoWeb> <pc33326> > >> > <AdminServer> < > >> >> <demo> > >> >> > > <portlets.coreFramework.remotingAccount.RemotingAccountController.getAl > >> > lAccountsAction(RemotingAccountController.java:79)> - Map of > > Accounts > >> size > >> > = 0 > >> > > >> > Thanks in advance > >> > Michael > >> > > >> > > >> > >> -- > >> View this message in context: > > http://www.nabble.com/Map-contains-no-data- > >> when-returned-from-remote-call---Aegis-databinding---empty-Map-- > >> tf4471690.html#a12768529 > >> Sent from the cxf-user mailing list archive at Nabble.com. > > > > > > > > -- > View this message in context: http://www.nabble.com/Map-contains-no-data- > when-returned-from-remote-call---Aegis-databinding---empty-Map-- > tf4471690.html#a12768812 > Sent from the cxf-user mailing list archive at Nabble.com.