cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From John Dowson <john.dow...@sherwoodcompliance.co.uk>
Subject Re: getting business domain objects out of a response object
Date Fri, 22 Jan 2010 13:57:07 GMT
Hi Dan,

Yes - that did it. Thanks a lot!

Regards,

John


On 21 Jan 2010, at 15:22, Daniel Kulp wrote:

>
> Can you may a small (compatible) change to the xsd file?
>
> You probably have something like:
>
> <element name="Rental">
>   <complexType>
>        <sequence>
>               .....
>
>
> If you change that to:
>
> <element name="Rental" type="Rental"/>
> <complexType name="Rental">
>     <sequence>
>        ....
>
> It will probably "just work".   The Rental object would be generated with an
> @XmlType annotation with name="Rental" and thus we can directly access it as a
> a type.
>
> Dan
>
>
>
>
> On Thu January 21 2010 6:38:58 am John Dowson wrote:
>> Hi Dan,
>>
>> thanks a lot for the reply.  Some more information:
>>
>> As I am relatively new to SOA, I am currently investigating various ways of
>> adding a web-service interface to a web application that takes input from
>> legacy systems through Excel spreadsheets via XML.
>>
>> If I define my own model and then define the web-services using this model
>> (java-first approach) then everything works as expected (i.e. the services
>> return business objects and not a response object). The problem occurs
>> when I generate my model from an XML schema file using JAXB (xjc) and then
>> build the web services on top of this model (again, a round-about
>> java-first approach!). The Rental class is therefore generated by the JAXB
>> xjc compiler and has both @XmlRootElement and @XmlType annotations
>> (although the name attribute is empty):
>>
>> @XmlAccessorType(XmlAccessType.FIELD)
>> @XmlType(name = "", propOrder = {
>>    "firstContact",
>>    "supplier",
>>    "managingRepair",
>> .....
>>    "repair"
>> })
>> @XmlRootElement(name = "rental")
>> public class Rental {
>>
>>    @XmlElement(name = "first-contact", required = true)
>>    @XmlSchemaType(name = "dateTime")
>>    protected XMLGregorianCalendar firstContact;
>> .....
>> }
>>
>>
>> I know this is a rather strange way of doing this as I should (probably) be
>> using the contract-first approach as I already have a reasonably
>> well-defined schema file. However, as I am currently investigating
>> different approaches, generating the model using JAXB seems (or seemed) to
>> be an easier approach than writing a WSDL by hand. Is there a problem with
>> this approach?
>>
>> The WSDL is automatically generated given the model and the services
>> definitions - relevant sections:
>>
>> <wsdl:message name="getClaimByReferenceNumberResponse">
>>    <wsdl:part element="tns:getClaimByReferenceNumberResponse"
>> name="parameters"></wsdl:part> </wsdl:message>
>>
>> <wsdl:message name="getClaimByReferenceNumber">
>>    <wsdl:part element="tns:getClaimByReferenceNumber"
>> name="parameters"></wsdl:part> </wsdl:message>
>>
>> <wsdl:portType name="MyServices">
>>    <wsdl:operation name="getClaimByReferenceNumber">
>>        <wsdl:input message="tns:getClaimByReferenceNumber"
>> name="getClaimByReferenceNumber"> </wsdl:input> <wsdl:output
>> message="tns:getClaimByReferenceNumberResponse"
>> name="getClaimByReferenceNumberResponse"> </wsdl:output> </wsdl:operation>
>> </wsdl:portType>
>>
>> <wsdl:binding name="MyServicesImplServiceSoapBinding"
>> type="tns:MyServices"> <soap:binding style="document"
>> transport="http://schemas.xmlsoap.org/soap/http"/>
>>
>>    <wsdl:operation name="getClaimByReferenceNumber">
>>        <soap:operation soapAction="" style="document"/>
>>
>>        <wsdl:input name="getClaimByReferenceNumber">
>>            <soap:body use="literal"/>
>>        </wsdl:input>
>>
>>        <wsdl:output name="getClaimByReferenceNumberResponse">
>>            <soap:body use="literal"/>
>>        </wsdl:output>
>>    </wsdl:operation>
>>
>> </wsdl:binding>
>>
>>
>> Thanks in advance.
>>
>> Regards,
>>
>> John
>>
>> On 20 Jan 2010, at 21:08, Daniel Kulp wrote:
>>> I'd probably need to see a small example and the wsdl and such.  Probably
>>> would need to see the Rental class as well, at least any class level
>>> annotations that are on it.
>>>
>>> One common things that would cause this is if the Rental class has an
>>> @XmlRootElement annotation, but not and @XmlType annotation.   Then
>>> again, I'm not even sure if that worked at all in 2.2.5.   I fixed SOME
>>> things when using this format in 2.2.6.  My fixes may have just been for
>>> JAX-RS though.  Don't really remember.   (been one of those weeks :-)
>>>
>>>
>>> Dan
>>>
>>> On Mon January 18 2010 10:05:55 am John Dowson wrote:
>>>> Hi,
>>>>
>>>> I am developing a simple web service interface to an existing web
>>>> application (java-first). I am using Apache CXF  2.2.5 and Spring 2.5.6.
>>>>
>>>> I have defined a simple web service interface:
>>>>
>>>> @WebService
>>>> public interface MyServices {
>>>>   public @WebResult(name="rental")Rental
>>>> getClaimByReferenceNumber(@WebParam(name="referenceNumber") String
>>>> referenceNumber); }
>>>>
>>>> and its corresponding implementation:
>>>>
>>>> @WebService(endpointInterface = "my.services.MyServices")
>>>> public class MyServicesImpl implements MyServices {
>>>>   @Autowired
>>>>   private ClaimService claimService;
>>>>
>>>>   public void setClaimService(ClaimService claimService) {
>>>>       this.claimService = claimService;
>>>>   }
>>>>
>>>>   @Transactional
>>>> //    @WebMethod
>>>>   @Override
>>>>   public Rental getClaimByReferenceNumber(String choReferenceNumber) {
>>>>
>>>>       Claim claim =
>>>> claimService.getClaimByReferenceNumber(choReferenceNumber);
>>>>
>>>>       Rental rental = MapUtils.convert(claim);
>>>>
>>>>       return rental;
>>>>   }
>>>> ...
>>>>
>>>> I can install this web service (on Tomcat 6.0.20) and it seems to work
>>>> ok.
>>>>
>>>> I then generate a test client to test the web service, using netbeans
>>>> 6.8 'New Web service Client' wizard, pointing the wizard to the WSDL
>>>> URL. The following test method correctly calls the web service and
>>>> marshals the result to a file:
>>>>
>>>> public class TestGetClaimService {
>>>>
>>>>   private static final String[] LOCATIONS = {"context.xml"};
>>>>
>>>>   public static void main(String[] args) throws Exception {
>>>>       ApplicationContext ctx = new
>>>> ClassPathXmlApplicationContext(LOCATIONS);
>>>>
>>>>       AXServices client = (AXServices) ctx.getBean("myServices");
>>>>
>>>>       GetClaimByReferenceNumberResponse.Rental rental =
>>>> client.getClaimByReferenceNumber("1923988"); JAXBContext context =
>>>> JAXBContext.newInstance(GetClaimByReferenceNumberResponse.Rental.class);
>>>>
>>>>       Marshaller m = context.createMarshaller();
>>>>       m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
>>>>
>>>>       System.out.println("Claim is: ");
>>>>       m.marshal(rental, System.out);
>>>> }
>>>>
>>>>
>>>> The problem I have is that I now have a
>>>> GetClaimByReferenceNumberResponse.Rental object, whereas what I actually
>>>> want is a Rental object (both classes are automatically generated from
>>>> the WSDL file). How can I achieve this, i.e. return a plain object from
>>>> the web service call rather than having it wrapped-up in a response
>>>> object,
>>>>
>>>>  Rental rental = client.getClaimByReferenceNumber("1923988");
>>>>       JAXBContext context = JAXBContext.newInstance(Rental.class);
>>>> ...
>>>>
>>>> I am guessing that this is a common problem but have not managed to find
>>>> a solution. All the tutorials I have seen seem to be able to return the
>>>> business object directly (i.e. not wrapped in a response), but I am
>>>> unsure of how they are doing this. I am new to Apache CXF and web
>>>> services in general, as well as this user list, so please forgive me if
>>>> this question has already been posed (how do you search the user
>>>> lists?).
>>>>
>>>> Let me know if you need anything else (WSDL file, for example)
>>>>
>>>> Thanks in advance,
>>>>
>>>>
>>>>
>>>> John L. Dowson MSc
>>>> Senior Developer
>>>>
>>>> Tel: +44 (0)1923 883921
>>>> Mobile: +44 (0)7929 630850
>>>> Email:
>>>> John.Dowson@SherwoodCompliance.co.uk<mailto:John.Dowson@SherwoodComplian
>>>> ce .co.uk>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ________________________________
>>>> Sherwood Compliance Services
>>>> Batchworth Park, London Road, Rickmansworth, Hertfordshire. WD3 1JS
>>>>
>>>>
>>>> This e-mail is only intended for the person(s) to whom it is addressed
>>>> and may contain confidential information.
>>>>
>>>> Sherwood Compliance Services does not accept responsibility for any loss
>>>> or damage caused by this e-mail or any attachments. Any opinions or
>>>> comments may be personal to the writer and may not represent the view of
>>>> Sherwood Compliance Services. If you have received this e-mail in error,
>>>> please notify the sender immediately and then delete this message from
>>>> your system.
>>>>
>>>> Company registered in England 4819089 at 55 Station Road, Beaconsfield,
>>>> Buckinghamshire. HP9 1QS
>>>
>>> --
>>> Daniel Kulp
>>> dkulp@apache.org
>>> http://www.dankulp.com/blog
>>
>> John L. Dowson MSc
>> Senior Developer
>>
>> Sherwood Compliance Services
>> Tel: +44 (0)1923 883921
>> Mobile: +44 (0)7929 630850
>> Email: John.Dowson@SherwoodCompliance.co.uk
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Sherwood Compliance Services
>> Batchworth Park, London Road, Rickmansworth, Hertfordshire. WD3 1JS
>>
>>
>> This e-mail is only intended for the person(s) to whom it is addressed and
>> may contain confidential information.
>>
>> Sherwood Compliance Services does not accept responsibility for any loss or
>> damage caused by this e-mail or any attachments. Any opinions or comments
>> may be personal to the writer and may not represent the view of Sherwood
>> Compliance Services. If you have received this e-mail in error, please
>> notify the sender immediately and then delete this message from your
>> system.
>>
>> Company registered in England 4819089 at 55 Station Road, Beaconsfield,
>> Buckinghamshire. HP9 1QS
>>
>
> --
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog

John L. Dowson MSc
Senior Developer

Sherwood Compliance Services
Tel: +44 (0)1923 883921
Mobile: +44 (0)7929 630850
Email: John.Dowson@SherwoodCompliance.co.uk









Sherwood Compliance Services
Batchworth Park, London Road, Rickmansworth, Hertfordshire. WD3 1JS


This e-mail is only intended for the person(s) to whom it is addressed and may contain confidential
information.

Sherwood Compliance Services does not accept responsibility for any loss or damage caused
by this e-mail or any attachments. Any opinions or comments may be personal to the writer
and may not represent the view of Sherwood Compliance Services. If you have received this
e-mail in error, please notify the sender immediately and then delete this message from your
system.

Company registered in England 4819089 at 55 Station Road, Beaconsfield, Buckinghamshire. HP9
1QS

Mime
View raw message