1、Jersey的配置应用
要使用@Path和@POST组合来组成前端访问后端的路径,就必须要实现Jersey的配置。
- 导入依赖
<!-- java.ws.rs是JAX-RS规范中定义的包名 --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0.1</version> </dependency> <!-- Jersey依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> </dependency>
- yml文件添加自定义端口号和项目路径(如果不添加的话port默认为8080,context-path的默认值为“/”)
server: # 项目端口 port: 8081 # 项目路径 servlet: context-path: /myspringboot
注册jersey servlet
所有 rest/* 的请求都将被 ServletContainer jersey servlet 容器接管。
@Configuration public class JerseyConfig { @Bean public ServletRegistrationBean jerseyServlet() { // 手动注册servlet ServletRegistrationBean registrationBean = new ServletRegistrationBean(new ServletContainer(), "/rest/*"); registrationBean.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,JerseyResourceConfig.class.getName()); return registrationBean; } }
- 创建Jersey Resources
public class JerseyResourceConfig extends ResourceConfig { public JerseyResourceConfig() { // 包扫描 packages("com.example.demo.controller"); // 注册json工具 register(JacksonFeature.class); // 注册自定义异常配置 register(TestExceptionMapper.class); } }
- 编写controller
@Path("/") @Controller public class JerseyTestController { @GET @Path("/test") public String test() { return "Hello Jersey"; } }
在浏览器输入URL:http://localhost:8081/myspringboot/rest/test
浏览器便能访问到后端,并且显示字符串"Hello Jersey"。
2、Jersey和JAX-RS
JAX-RS
JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java注解来简化Web服务的客户端和服务端的开发和部署。
Jersey
Jersey RESTful WebService框架是一个开源的、产品级别的JAVA框架,支持JAX-RS API并且是一个JAX-RS(JSR 311&JSR 339)的参考实现。Jersey不仅仅是一个JAX-RS的参考实现,Jersey提供自己的API,其API继承自JAX-RS,提供更多的特性和功能以进一步简化RESTful service和客户端的开发。
Jersey 1.x 使用的是sun的com.sun.jersey
Jersey 2.x 使用的是glassfish的org.glassfish.jersey
Jersey与JAX-RS的关系
JAX-RS是java自己的一个小的框架,实现了restful风格,只不过功能不是很强大;而Jersey呢,它是一个比较成熟的restful框架了,它在设计的时候,是基于JAX-RS的,它使用了java的JAX-RS的一些注解,当然了,他也有自己的特有注解,以及其他更强大的功能。
3、JAX-RS注解
第一类
@Path:标注资源类或者方法的相对路径,client通过这个路径访问资源
第二类
@GET:标注http请求的类型是查询请求
@POST:标注http请求的类型是插入请求
@PUT:标注http请求的类型是更新请求
@DELETE:标注http请求的类型是删除请求
第三类
@Produces:标注返回的MIME媒体类型
@Consumes:标注可接受请求的MIME媒体类型
第四类
@PathParam:写在方法的参数中,获得请求路径参数。比如:@PathParam(“username”) String userName
@QueryParam:写在方法的参数中,获得请求路径附带的参数。比如:@QueryParam(“desc”) String desc
@FormParam:form传递的参数,接受form传递过来的参数。比如:@FormParam(“name”) String userName
@BeanParam:通过Bean的形式传递参数,接受client传递的bean类型的参数,同时这个bean可以在属性上配置@FormParam用以解决client的属性名称和bean的属性名称不一致的问题。比如:@BeanParam User user
@HeaderParam:标注方法参数来自http请求的headers
@CookieParam:标注方法参数来自http请求的cookie
第五类
@Context:写在方法的参数中,获得一些系统环境信息,通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等
4、ExceptionMapper< E extends Throwable >介绍
对于项目中自定义的异常,前端是不会返回任何异常/错误信息的,如http 500报错信息。这时就需要在jersey中进行配置。
public class TestExceptionMapper implements ExceptionMapper<TestException> { @Override public Response toResponse(TestException exception) { int responseCode =505; String errorMsg = "xxx报错"; return Response.status(responseCode).header("reason", exception.getMessage()) .entity(errorMsg).type(MediaType.APPLICATION_JSON).build(); } }
代码中TestException是自定义异常,如果它产生了异常,就会报505错误。
然后将TestExceptionMapper通过register方法手工注册到jersey容器中。
public class JerseyResourceConfig extends ResourceConfig { public JerseyResourceConfig() { // 包扫描 packages("com.example.demo.controller"); // 注册自定义异常配置 register(TestExceptionMapper.class); } }