zoukankan      html  css  js  c++  java
  • 【spring boot】SpringBoot初学(5)– WebService之Jersey

    前言

      github: https://github.com/vergilyn/SpringBootDemo

      代码位置:

    image

    一、准备

      spring boot对jersey1.x与jersey2.x的注入方式有区别。本文是针对2.x的配置(服务端,不包含客户端调用。)

      需要依赖的POMs 

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>

      jersey的配置与别的不同的是:需要一个ResourceConfig类型的@Bean,用于注册所有的端点(endpoints)。

    二、demo

      2.1 用于注册所有endpoints的Config
    /* 想要开始使用Jersey 2.x只需要加入spring-boot-starter-jersey依赖,
     * 然后你需要一个ResourceConfig类型的@Bean,用于注册所有的端点(endpoints,demo为JerseyController)。
     */
    //@Component
    @Configuration
    //Jersey servlet将被注册,并默认映射到/*。可将@ApplicationPath添加到ResourceConfig来改变该映射。
    @ApplicationPath("/rest")
    public class JerseyConfig extends ResourceConfig {
        public JerseyConfig() {
            register(JerseyController.class);
    //      packages("com.vergilyn.demo.springboot.jersey"); // 通过packages注册。
        }
    }
    
      2.2 endpoints
    /*
     * 所有注册的端点都应该被@Components和HTTP资源annotations(比如@GET)注解。
     * 1、因为是@Component,所以其生命周期受Spring管理。
     * 		并且你可以使用@Autowired添加依赖及使用@Value注入外部配置。
     */
    //@Component
    @RestController
    @Path("/jersey")
    public class JerseyController {
        @GET
        @Path("/get")
        @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        @Produces(MediaType.APPLICATION_JSON)
        public Map<String, Object> getMessage() {
            return Constant.map;
        }
    
        @POST	//POST形式在浏览器地址栏输入请求路径不一定能访问到。推荐用fiddler工具或者firefox浏览器插件(poster或HttpRequester)
        @Path("/post")
        @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        @Produces(MediaType.APPLICATION_JSON)
        public Map<String, Object> postMessage() {
            return Constant.map;
        }
    }

      到此需要注意的有:

        1. 如果是post形式,浏览器不一定可直接访问得到json。最好用Fiddler工具或者FireFox浏览器插件(Poster或HttpRequester)测试接口。

        2. 既然是RESTful,所以建议直接用@RestController,而并不建议使用@Controller。

        3. 所有注册的端点都应该被@Components和HTTP资源annotations(比如@GET)注解。

      2.3 SpringApplication
    @SpringBootApplication
    public class JerseyApplication {
    	/* 代码注入:
    	 *  此种方式需注意:ServletRegistrationBean的配置,及最终的请求路径。
    	 * 注解注入:
    	 *  JerseyConfig.java中用@Configuration
    	 */
    //	@Bean
    	public ServletRegistrationBean jerseyServlet() {
    		/* 特别注意此路径,与JerseyController中的@Path。可能让最终路径变成:localhost:8080/rest/jersey/get
    		 * rest是此ServletRegistrationBean定义的(同ResourceConfig的类注解@ApplicationPath("/rest"))
    		 * jersey是Controller中类注解@Path定义的
    		 */
    		ServletRegistrationBean registration = new ServletRegistrationBean(
    				new ServletContainer(), "/rest/*");
    		// our rest resources will be available in the path /rest/*
    		registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,
    				JerseyConfig.class.getName());
    		return registration;
    	}
    
    	public static void main(String[] args) {
    		SpringApplication.run(JerseyApplication.class, args);
    	}
    }

      到此,所有的jersey2.X服务端代码就算完成。

      如果是get请求,那么浏览器直接请求:localhost:8080/rest/jersey/get 就可以得到返回的json结果。(虽然代码中get返回的是Map,但定义@Produces(MediaType.APPLICATION_JSON))

      至于请求参数的接收、客户端的调用,和spring集成Jersey是差不多的。这主要是用spring boot集成Jersey,不细说Jersey。

      (很早之前的看的一篇jersey的教程:使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

      (题外话:记得当初在spring中使用jersey的一个问题是,在endpoints中无法注入其他service/dao的bean。然后,貌似记得是通过spring的上下文强制getBean()才把别的service/到注入到了enpoint中。不清楚是那框架搭建有问题,还是怎么的,只是记得遇到过这奇怪的问题。)

    image

    image

  • 相关阅读:
    【iOS 实践笔记】UITableView顶部空白
    【iOS入门】dequeueReusableCellWithIdentifier:和dequeueReusableCellWithIdentifier:forIndexPath:的区别
    【iOS 入门】@class关键字
    【iOS 入门 动画学习】
    【android seekbar 增大拖动区域】
    【android 动画小技巧】一个控制顺序播放多个动画。
    【android 视频播放那些事之缓存】
    【java8 代码块新功能】
    Mac下使用gradlew命令
    Python格式符说明
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/6546029.html
Copyright © 2011-2022 走看看