Xfire and JSR 181 Annotations

本文介绍如何通过JSR181规范为XFire添加注解支持,包括使用Java 5和commons-attributes实现服务创建的过程。此外,还提供了使用注解编写服务的具体示例,并介绍了XFire提供的额外注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSR 181 Annotations

We are working on adding JSR 181 2.0 support for annotations in XFire via Java 5 and commons-attributes. The Java 5 implementation will follow the JSR 181 spec and the commons-attributes implementation will mimic the spec in a pre-Java 5 way.

Currently we have not passed the TCK and this is available only in early access form only. However, what we have is fairly stable and we are working on passing the TCK as soon as it is out. (Yes we know the JSR 181 1.0 TCK is out, be we are intent on passing the 2.0 version as we are implementing JAX-WS as well).

As covered before, ServiceFactories are used to create services from classes. The default ServiceFactory is ObjectServiceFactory. To use annotations you must use the AnnotationsServiceFactory. You must pass it an annotation reader in the constructor which will read the particular type of annotation you are using.

Using Java 5 Annotations

XFire xfire = XFireFactory.getInstance().getXFire();
AnnotationServiceFactory factory = new AnnotationServiceFactory(xfire.getTransportManager());
Service service = factory.create(YourService.class)
xfire.getServiceRegistry().register(service);

In your services.xml, it would look like this:

<service>

  <name>ServiceName</name>
  <namespace>urn:your:namespace</namespace>
  <serviceClass>your.service.Class</serviceClass>
  <serviceFactory>org.codehaus.xfire.jaxws.JAXWSServiceFactory</serviceFactory>

</service>

 

The jar with the Java 5 JSR 181 annotations can be found here

Using Commons-Attributes Annotations

To use the commons-attributes annotations, you will need to follow these instructions on how to install the commons-attributes ant or maven plugin.

XFire xfire = XFireFactory.getInstance().getXFire();
TypeMappingRegistry registry = new DefaultTypeMappingRegistry();

AnnotationServiceFactory factory = new AnnotationServiceFactory(xfire.getTransportManager());
Service service = factory.create(YourService.class)
xfire.getServiceRegistry().register(service);

In your services.xml, it would look like this:

<service>

  <name>ServiceName</name>
  <namespace>urn:your:namespace</namespace>
  <serviceClass>your.service.Class</serviceClass>
  <serviceFactory>org.codehaus.xfire.annotations.AnnotationServiceFactory</serviceFactory>

</service>

Writing Services with Annotations

Javadocs (See the javax.jws packages only).

Example:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "EchoService", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")
        public class Jsr181EchoService
{
    @WebMethod(operationName = "echoString", action = "urn:EchoString")
    @WebResult(name = "echoResult")
    public String echo(@WebParam(name = "echoParam", header = true) String input)
    {
        return input;
    }
}

Alternatively you can place your annotations in your interface and have your implementation refer to it as shown below.

The interface:

package com.example;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "EchoService",  targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")
public interface Jsr181EchoService
{
    @WebMethod(operationName = "echoString", action = "urn:EchoString")
    @WebResult(name = "echoResult")
    public String echo(@WebParam(name = "echoParam", header = true) String input);
}

and the implementation:

package com.example;

import javax.jws.WebService;

@WebService(endpointInterface = "com.example.Jsr181EchoService")
public class Jsr181EchoServiceImpl
{
    public String echo(String input)
    {
        return input;
    }
}

To do this with commons-attributes instead, you will need to import the attributes from a different location and use the commons-attributes syntax:

import org.codehaus.xfire.annotations.commons.WebMethod;
import org.codehaus.xfire.annotations.commons.WebParam;
import org.codehaus.xfire.annotations.commons.WebResult;
import org.codehaus.xfire.annotations.commons.WebService;

/**
 * @@WebService(name = "EchoService", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")
 * @@org.codehaus.xfire.annotations.commons.soap.SOAPBinding(style = 1)
 */
public class CommonsEchoService
{

    /**
     * Returns the input.
     *
     * @param input the input.
     * @return the input.
     * @@WebMethod(operationName = "echoString", action="urn:EchoString")
     * @@.echoParam WebParam("echoParam")
     * @@.return WebResult("echoResult")
     */
    public String echo(String inputString)
    {
        return inputString;
    }
}

Using custom annotations 

Additionaly XFire provides some annotations which are not part of JSR 181, but allows to use XFire specific functionality .

package org.codehaus.xfire.annotations;

@EnableMTOM
@ServiceProperty(key="singlePropertyKey",list={"value3","value2"} )
@ServiceProperties*(properties={@ServiceProperty(key="key12",value="value12")})
@WebService(name="EchoService", targetNamespace="http://www.open.uri.org/2004/04/HelloWorld" )

public class Jsr181EchoService {

}

@EnableMTOM - enable MTOM on service

@ServiceProperty - allows to specify property on given serwise ( instead of creating <poperties><property key="propertyKey">propertyValue</property></properties> tags in service configuration file )

@ServicesProperties - allows to specify as many properties as you want, at once

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值