JAX-RS 从傻逼到牛叉 5:资源的动态定位

标签: jax rs 傻逼 | 发表时间:2011-12-21 16:00 | 作者:蜀山兆孨龘
出处:http://www.blogjava.net/

目前我们的电影服务只提供了对电影信息的访问服务,现在我们要再增加两项级服务,分别用来访问导演和演员信息。加上原先的电信信息服务,我们把 URI 统一放到 /ms/rest/service/ 的子路径下。最先想到的方法就是为这三个 URI 分别写 JAX-RS 服务:

@Singleton
@Path("service/movie")
public class MovieService {
    // 此处省略若干行
}

@Singleton
@Path("service/director")
public class DirectorService {
    // 此处省略若干行
}

@Singleton
@Path("service/director")
public class ActorService {
    // 此处省略若干行
}
    

这种写法的缺点就是让三个本来有点关系(父级 URI 相同)的服务被放到了毫不相干的三个类里面,不一个个类地查看注解难以看出这点关系。为此,JAX-RS 提供了动态资源绑定的功能,让我们能够对这种情况做一些整理。

首先,我们引入一个服务定位器来处理集中管理这三个子级服务:

@Singleton
@Path("service")
public class ServiceLocator {
    @Inject
    private MovieService movieService;
    @Inject
    private DirectorService directorService;
    @Inject
    private ActorService actorService;
    private Map<String, Object> serviceMap;

    @PostConstruct
    private initServiceMap() {
        serviceMap = new HashMap<>();
        serviceMap.put("movie", movieService);
        serviceMap.put("director", directorService);
        serviceMap.put("actor", actorService);
    }

    @Path("{name}")
    public Object locateService(@PathParam("name") String name) {
        Object service = serviceMap.get(name);
        if (service == null) {
            throw new WebApplicationException(Status.SERVICE_UNAVAILABLE);
        }
        return service;
    }
}
    

该类中的 locateService 方法根据服务的名称返回相应的服务实例,注意该方法只有一个 @Path 注解,因为它并不清楚请求的具体内容;返回对象的类型为 Object,表明动态资源定位不要求服务类实现相同的接口,只需要它们的方法带有相应的 JAX-RS 注解,就能够被 JAX-RS 自动发现和处理(专业术语称为 introspect,内省),以 MovieService 为例:

@Singleton
public class MovieService {
    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Movie find(@PathParam("id") int id) {
        return movieDao.find(id);
    }

    // 此处省略若干行
}

这样,每个请求实际上都由两个类先后处理。例如,处理请求 GET /ms/rest/service/movie/1 的时候,先由 ServiceLocator 返回相配的服务实例 movieService,然后再由该实例的 find 方法返回结果。比起最开始那三个简单的类,虽然多了一层调用,但换来了更加清晰的结构。

动态资源定位是一个非常灵活强大的功能,用好的话,完全可以把 URI 层次整理成一个类似于文件目录结构的抽象文件系统。



蜀山兆孨龘 2011-12-21 16:00 发表评论

相关 [jax rs 傻逼] 推荐:

JAX-RS 从傻逼到牛叉 5:资源的动态定位

- - BlogJava-首页技术区
目前我们的电影服务只提供了对电影信息的访问服务,现在我们要再增加两项级服务,分别用来访问导演和演员信息. 加上原先的电信信息服务,我们把 URI 统一放到. /ms/rest/service/ 的子路径下. 最先想到的方法就是为这三个 URI 分别写 JAX-RS 服务:. // 此处省略若干行 } @Singleton @Path("service/director") public class DirectorService {.

JAX-RS 从傻逼到牛逼 2:开发一个简单的服务

- 时金魁 - BlogJava-首页技术区
JAX-RS 使用注解进行配置,所以用它开发 REST 风格的服务非常简单. 楼主在本文用一个小例子来说明 JAX-RS 的基本用法. 假设楼主要开发一个小电影服务,客户端可以通过请求 URI 对电影进行 CRUD 操作. 为简明起见,这儿不使用数据库,只在内存中模拟. 先用一个非常简单的 Movie 类,在后续的文章中根据情况逐步扩充:.

WebService之JAX-WS、CXF、Spring3.0+

- - 博客园_首页
          面对工作的需要,web服务这一块一直都在身边转悠着. 既然工作中需要这些,作为程序员就应该去了解和学习. 下面主要简述采用CXF+Spring+JAX-WS来发布WebService服务,以及创建客户端调用服务.          1、先了解关于WebService的相关概念以及一些专有名词的解释:.

mongodb利用rs,实现ha和备份

- - CSDN博客推荐文章
mongodb最简单的部署方式,是单节点部署. 国庆前找了台8核,48G RAM的server,在100+并发的压力下跑了一个星期,也没有发现数据丢失和server负载过大的情况. 但是单节点部署还是有一些问题,第一是无法做HA,如果该mongod down掉,或者部署的server down掉,应用就无法工作;第二是不利于备份,因为在备份的时候,会给mongod额外的负担,有可能影响业务;第三是无法做读写分离.

利用JAX-WS开发Web服务

- - CSDN博客推荐文章
利用JAX-WS开发Web服务.        Web服务是一种经由HTTP与其他软件进行通信的软件. Java最激动人心的一个特性是用于XML Web服务的Java API(JAX-WS). JAX-WS是一组Java类和包,他可以创建对Web服务发出请求的客户端,以及接受这些请求的服务.        JAX-WS支持使用简单对象访问协议(SimpleObject Access Protocol,SOAP)和表述性状态转移(Representational State Transfer,REST)实现的Web服务.

傻逼兮兮才有未来

- So - 牛博国际
      曾几何时中国还有个女子足球,当男足四处卖淫的时候,女足似乎还行. 当时女足有个孙庆梅,踢得不错,那时候日本刚刚有女子足球,孙庆梅在松下队踢过一阵,帮松下拿了全日本冠军.      当时的《足球报》采访过孙红梅,她对日本女球员的评论是傻逼兮兮,只会“加油干”,连赢了球就不要再加油了都不知道,言下之意很看不起对这种一根筋的加油干.

牛逼和傻逼的区别就是一个把妹

- Linker Lin - 微博段子
牛逼和傻逼的区别就是一个把妹睡觉听说iPhone出新的了就买,另一个熬夜看发布会但是新品出了却没钱买. 原文地址:http://www.tduanzi.com/tweets/14893.html.

二十多年来,无论我做什么,都有一堆傻逼说我“不务正业”。一定程度上,这反应了中国人最令人作呕的一面:他们总是替你决定什么是你的“正业”。——@罗永浩

- 梁振华 - 饭否 | 饭友经典语录
二十多年来,无论我做什么,都有一堆傻逼说我“不务正业”. 一定程度上,这反应了中国人最令人作呕的一面:他们总是替你决定什么是你的“正业”.