【spring boot】SpringBoot初学(5)– WebService之Jersey

前言

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

  代码位置:

【spring boot】SpringBoot初学(5)– WebService之Jersey

一、准备

  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中。不清楚是那框架搭建有问题,还是怎么的,只是记得遇到过这奇怪的问题。)

【spring boot】SpringBoot初学(5)– WebService之Jersey

【spring boot】SpringBoot初学(5)– WebService之Jersey