Java API
Current Module Context
以下为CurrentModuleContext的Java类
| package org.osoa.sca; public final class CurrentModuleContext { public static ModuleContext getContext() {...} } |
CurrentModuleContext类有下列方法:
getContext() – 返回当前的模块上下文
注意: CurrentModuleContext实现中关于服务提供者的部分会在未来的规范中定义。
Module Context
以下为ModuleContext的Java接口
| package org.osoa.sca; import org.osoa.sca.model.Module; public interface ModuleContext { String getName(); String getURI(); Module getMetaData(); RequestContext getRequestContext(); Object locateService(String serviceName); ServiceReference createServiceReferenceForSession(Object self); ServiceReference createServiceReferenceForSession(Object self, String serviceName); ServiceReference newSession(String serviceName); ServiceReference newSession(String serviceName, Object sessionID); } |
ModuleContext接口有如下方法:
如果仅定义了一个服务,service-name可以不写
Request Context
以下为RequestContext 的Java接口。
| package org.osoa.sca; import java.util.Map; import javax.security.auth.Subject; public interface RequestContext { Subject getSecuritySubject(); String getServiceName(); ServiceReference getServiceReference(); } |
RequestContext接口有以下方法:
ServiceReference
任何实现了ServiceReference接口的对象也可以强制类型转换成该引用对应的服务类型的业务接口。所有远程服务的实现的引用均同时实现了ServiceReference接口和业务接口。
| package org.osoa.sca; public interface ServiceReference { Object getSessionID(); void endSession(); Object getCallbackID(); void setCallbackID(Object callbackID); Object getCallback(); void setCallback(Object callback); } |
ServiceReference的Java接口有以下方法:
No Registered Callback Exception
以下是NoRegisteredCallbackException。
| package org.osoa.sca; public class NoRegsiteredCallbackException extends ServiceRuntimeException { … } |
Service Runtime Exception
以下是ServiceRuntimeException。
| package org.osoa.sca; public class ServiceRuntimeException extends RuntimeException { … } |
Service Unavailable Exception
以下是ServiceRuntimeException。
| package org.osoa.sca; public class ServiceUnavailableException extends ServiceRuntimeException { … } |
Session Ended Exception
以下是SessionEndedException.
| package org.osoa.sca; public class SessionEndedException extends ServiceRuntimeException { … } |
Java标签
本节为所有SCA相关的Java标签的定义。
@AllowsPassByReference
以下是@AllowsPassByReference标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({Type, METHOD}) @Retention(RUNTIME) public @interface AllowsPassByReference { } |
@AllowsPassByReference标签是用于远程接口的实现上,用来示意与该服务处于同一模块内的数据交互可以允许传引用的语义。实现保证了参数和返回值是传值的语义即使实际中用的都是传引用的方式。这意味着即使从一个操作返回后,服务也不会修改输入参数和返回值。@AllowsPassByReference annotation标签可以标注在实现远程服务的整个类上,也可以标注在单个的远程服务方法上。
| @AllowsPassByReference public class HelloServiceImpl implements HelloService { … } |
以下为使用@AllowsPassByReference标注Java组件实现类的一个服务方法实现的例子
| @AllowsPassByReference public String hello(String message) { … } |
@Callback
以下为@Callback标签的类型定义:
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(TYPE, METHOD, FIELD) @Retention(RUNTIME) public @interface Scope { String value() default null; } |
@Callback标签用于标注一个带有回调接口的远程接口,它以该接口的Java的Class对象作为参数。
@Callback有以下属性:
value – 用以描述回调接口的Java类文件的名字。
@Callback标签也可用于标注SCA实现的一个方法或一个字段,用以注入一个回调。
以下为接口上的一个回调标签:
| @Remotable @Callback(MyServiceCallback.class) public interface MyService { public void someAsyncMethod(String arg); } |
以下为@ComponentName标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface ComponentName { } |
@ComponentName标签用在一个Java类的字段或setter方法上,用以注入组件的名字。
以下为定义一个组件名称的字段的例子。
| @ComponentName private String componentName; |
@ComponentMetadata
以下为@ComponentMetaData标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface ComponentMetadata { } |
@ComponentMetadata标签标注在一个用于注入组件元数据对象的Java类字段或setter方法上,元数据是一个对应当前组件在组件定义文件中的
以下是一个组件元数据字段的定义的例子。
| @ComponentMetadata private Component componentMetadata; |
@Context
以下是@Context 标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Context { } |
@Context标签标注在一个用于注入模块上下文的Java类字段或setter方法上,类型都是ModuleContext。
以下是一个ModuleContext字段类型的定义。
| @Context private ModuleContext moduleContext; |
@Destroy
以下是@Destroy标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(METHOD) @Retention(RUNTIME) public @interface Destroy { } |
@Destroy标签用来标注一个Java类的方法,该方法会在类所实现的本地服务定义的范围结束的时候被调用。该方法必须带零个参数并且没有返回值,且标注的方法必须为public。
以下为一个销毁方法的定义。
| @Destroy void myDestroyMethod() { … } |
@Init
以下是@Init标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(METHOD) @Retention(RUNTIME) public @interface Init { public boolean eager() default false; } |
@Init标签用来标注一个Java类的方法,该方法会在类所实现的本地服务定义的范围开始的时候被调用。该方法必须带零个参数并且没有返回值,且标注的方法必须为public。
所标记的方法将在所有属性和引用均注入以后被调用。
@Init标签有以下属性:
eager – 对于有范围的组件, eager = true 告诉容器在创建组件的范围以后马上实例化该组件。当eager = false的时候, 组件的实例是在它们首次被引用的时候实例化的。缺省值为false。
以下是一个init方法的定义的例子。
| @Init void myInitMethod() { … } |
@Property
以下是@Property标签的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Property { public String name() default ""; public boolean required() default false; } |
@Property标签是用来标记Java类的一个用于注入配置属性的字段或setter方法。所注入的属性的类型是由Java类的字段类型或setter方法的输入参数类型来确定的。
即便没有@Property标签,属性也可以通过public的setter方法被注入。但对于非public的字段的注入就必须使用@Property标签。如果不使用@Property标签,则属性的名字就是字段或者setter方法的参数的名字。
当一个属性既有setter方法也有字段时,则使用setter方法。
@Property标签有如下属性:
以下是一个属性字段定义的例子。
| @Property(name="currency", required=true) private String currency; |
以下是一个属性setter方法的例子
| @Property(name="currency", required=true) public void setCurrency( String theCurrency ); |
@Reference
以下是@Reference标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Reference { public String name() default ""; public boolean required() default true; } |
@Reference标签是用来标记Java类的一个注入服务引用的字段或setter方法。
即便没有@Reference标签,引用也可以通过public的setter方法被注入。但对于非public的字段的注入就必须使用@Reference标签。如果不使用@Reference标签,则引用的名字就是字段或者setter方法的参数的名字。
当一个引用既有setter方法也有字段时,则使用setter方法。
@Reference标签有如下属性:
以下是一个引用字段定义的例子。
| @Reference(name="stockQuote", required=true) private StockQuoteService stockQuote; |
以下是一个引用的setter方法的例子
| @Reference(name="stockQuote", required=true) public void setStockQuote( StockQuoteService theSQService ); |
@Remotable
以下是@Remotable标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(TYPE) @Retention(RUNTIME) public @interface Remotable { } |
@Remotable标签用于标记一个Java服务接口为远程的。远程服务能通过入口点对外发布并能翻译成WSDL的portTypes。
以下是一个远程服务接口定义的例子。
| @Remotable public interface HelloService { … } |
@Scope
以下是@Scope标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(TYPE) @Retention(RUNTIME) public @interface Scope { String value() default "stateless"; } |
@Scope标签用在服务接口定义或者服务实现类上。
@Scope标签有以下属性:
value – 范围的名字,已支持的取值参见有状态资源模式的实现一节。
以下为一个有范围的接口定义的例子。
| package services.shoppingcart; @Scope(“session”) public interface ShoppingCartService { void addToCart(Item item); } |
@Service
以下是@Service标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(TYPE) @Retention(RUNTIME) public @interface Service { Class[] interfaces() default {}; Class value() default null; } |
@Service标签用在一个Java实现上,用来标记其实现的服务的接口。一个用于实现接口的类不一定要有@Service。如果没有标签,则假定它所实现的所有标记为@Remotable的接口就是该组件提供的接口。如果实现的接口都不是远程的,则默认该组件提供的唯一服务就是实现类本身。
@Service标签有以下属性:
没有指定属性的@Service标签是没有任何意义,就如同该标签不存在。
服务的服务名称默认是不带包名接口或类的名字。
以下为一个使用服务标签的例子。
| package services.hello; @Service(HelloService.class) public class HelloServiceImpl implements HelloService, AnotherInterface{ public String hello(String message) { ... } … } |
@Session
以下是@Session标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target(TYPE) @Retention(RUNTIME) public @interface Session { public String maxIdleTime() default ""; public String maxAge() default ""; public boolean singlePrincipal() default false; } |
@Session标签用于一个Java类。该标签的属性有如下含义:
两个以时间为值的属性的取值为,一个整数接一个空格和"seconds", "minutes", "hours", "days" 或 "years"中任意一个的字符串。
如果没有设置超时,则超时的实现将完全由SCA运行期的实现来定义。
以下是一个例子:
| package service.shoppingcart; import org.osoa.sca.annotations.* @Session(maxAge="30 days"); public class ShoppingCartServiceImpl implements ShoppingCartService { ... } |
@SessionID
以下是@SessionID标签的的类型定义。
| package org.osoa.sca.annotations; import java.lang.annotation.ElementType.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Target; @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface SessionID { } |
@SessionID标签是用来标记Java类的一个用于注入session ID的字段或setter方法。系统生成的ID总是字符串,但是应用生成的会话ID则可能是其他复杂类型,如“应用指定的会话ID”一节所述。
以下是一个例子。
| @SessionID private String sessionID; |
WSDL 2 Java and Java 2 WSDL
SCA客户端及其Java实现所使用WSDL到 Java和Java到 WSDL的映射规则,使用的是JAX-WS[4]规范所定义的从WSDL portTypes生成远程Java接口及其反向生成规范。
从Java类型到XML schema类型的映射, SCA支持SDO 2.0 [1] 和 JAXB [2]
映射。
使用JAX-WS映射时有以下约束:
注意: 这部分规范需要更多关于如何使用JAX-WS客户端异步模型的例子和讨论。
计划中规范的未来增补
本版本规范为不完整的,有些领域将在规范的未来版本中覆盖到。这其中包括:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639375/viewspace-151148/ ,如需转载,请注明出处,否则将追究法律责任。