resteasy经验谈

resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现,近日在实际项目中遇到了几个问题,记录于此:

一、如何用fastjson替换默认的jackson

默认情况下,resteasy使用jacksonjaxb来实现json及xml格式的序列化。应用启动时,会自动扫描带@Provider的包,找到最合适的provider。fastjson也提供了jax-rs的Provider实现,如果希望使用fastjson来替换默认的jackson,可以按如下步骤操作:

1.1、去掉默认的jackson-provider以及jaxb-provider依赖

即:

//    compile ‘org.jboss.resteasy:resteasy-jackson-provider:3.0.14.Final‘//    compile ‘org.jboss.resteasy:resteasy-jaxb-provider:3.0.16.Final‘

把这二个依赖jar包去掉,同时记得添加最新的fastjson依赖(1.2.9+版本)

1.2、修改web.xml

 1 <web-app id="WebApp_ID" version="2.4"
 2          xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 4     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 5     <display-name>Restful Web Application</display-name>
 6
 7     <context-param>
 8         <param-name>resteasy.resources</param-name>
 9         <param-value>com.cnblogs.yjmyzz.ProductService</param-value>
10     </context-param>
11
12     <context-param>
13         <param-name>resteasy.scan.providers</param-name>
14         <param-value>false</param-value>
15     </context-param>
16
17     <context-param>
18         <param-name>resteasy.providers</param-name>
19         <param-value>com.alibaba.fastjson.support.jaxrs.FastJsonProvider</param-value>
20     </context-param>
21
22     <listener>
23         <listener-class>
24             org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
25         </listener-class>
26     </listener>
27
28     <servlet>
29         <servlet-name>resteasy-servlet</servlet-name>
30         <servlet-class>
31             org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
32         </servlet-class>
33     </servlet>
34
35     <servlet-mapping>
36         <servlet-name>resteasy-servlet</servlet-name>
37         <url-pattern>/*</url-pattern>
38     </servlet-mapping>
39
40 </web-app>

解释一下:

resteasy.scan.providers:false 是为了防止resteasy自动扫描@Provider的类

resteasy.providers:com.alibaba.fastjson.support.jaxrs.FastJsonProvider 这里指定了使用fastjson来解析json.

二、输出非UTF-8编码格式的问题

默认情况下,fastjson是采用UTF-8的,详情见 com.alibaba.fastjson.support.config.FastJsonConfig#FastJsonConfig 源码

 1     public FastJsonConfig() {
 2
 3         this.charset = Charset.forName("UTF-8");
 4
 5         this.serializeConfig = SerializeConfig.getGlobalInstance();
 6         this.parserConfig = new ParserConfig();
 7
 8         this.serializerFeatures = new SerializerFeature[0];
 9         this.serializeFilters = new SerializeFilter[0];
10         this.features = new Feature[0];
11     }

所以,就算在REST服务的Procuces里指定了其它编码也没用

@Path("/product")
@Produces({"application/json; charset=GBK"})
public class ProductService {
    //...
}

解决办法:又到了我大OOP出场的时候

package com.cnblogs.yjmyzz;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;

import java.nio.charset.Charset;

/**
 * Created by 菩提树下的杨过(http://yjmyzz.cnblogs.com/) on 2017/4/24.
 */
public class FastJsonConfigGBK extends FastJsonConfig {

    public FastJsonConfigGBK() {
        super();
        setCharset(Charset.forName("GBK"));
        setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
    }
}

从FastJsonConfig派生出一个默认编码为GBK的子类FastJsonConfigGBK,然后再来一个

package com.cnblogs.yjmyzz;

import com.alibaba.fastjson.support.jaxrs.FastJsonProvider;

/**
 * Created by 菩提树下的杨过(http://yjmyzz.cnblogs.com/) on 2017/4/24.
 */
public class FastJsonProviderGBK extends FastJsonProvider {

    public FastJsonProviderGBK() {
        super();
        setFastJsonConfig(new FastJsonConfigGBK());
    }
}

最后在web.xml中,参考下面调整:

    <context-param>
        <param-name>resteasy.providers</param-name>
        <param-value>com.cnblogs.yjmyzz.FastJsonProviderGBK</param-value>
    </context-param>

大功告成。

三、405 Method Not Allowed无响应信息的处理

resteasy有一套默认的异常处理机制,但默认情况下并未处理405状态的异常,见下表:

Exception HTTP Code Description
ReaderException 400 All exceptions thrown from MessageBodyReaders are wrapped within this exception. If there is no ExceptionMapper for the wrapped exception or if the exception isn‘t a WebApplicationException, then resteasy will return a 400 code by default.
WriterException 500 All exceptions thrown from MessageBodyWriters are wrapped within this exception. If there is no ExceptionMapper for the wrapped exception or if the exception isn‘t a WebApplicationException, then resteasy will return a 400 code by default.
o.j.r.plugins.providers.jaxb.JAXBUnmarshalException 400 The JAXB providers (XML and Jettison) throw this exception on reads. They may be wrapping JAXBExceptions. This class extends ReaderException
o.j.r.plugins.providers.jaxb.JAXBMarshalException 500 The JAXB providers (XML and Jettison) throw this exception on writes. They may be wrapping JAXBExceptions. This class extends WriterException
ApplicationException N/A This exception wraps all exceptions thrown from application code. It functions much in the same way as InvocationTargetException. If there is an ExceptionMapper for wrapped exception, then that is used to handle the request.
Failure N/A Internal Resteasy. Not logged
LoggableFailure N/A Internal Resteasy error. Logged
DefaultOptionsMethodException N/A If the user invokes HTTP OPTIONS and no JAX-RS method for it, Resteasy provides a default behavior by throwing this exception

所以,如果有一个方法,仅允许POST提交,但是用GET请求来访问时,没有任何响应,包括错误码,大多数情况下这不是问题,但是如何用一些url监管系统来检测url是否可访问时,由于没有任何响应,会认为该url无效。

解决办法:自己定义异常处理ExceptionHandler,参考以下代码:

 1 package com.cnblogs.yjmyzz;
 2
 3 import javax.ws.rs.NotAllowedException;
 4 import javax.ws.rs.core.Response;
 5 import javax.ws.rs.ext.ExceptionMapper;
 6 import javax.ws.rs.ext.Provider;
 7
 8 /**
 9  * Created by yangjunming on 2017/4/26.
10  */
11 @Provider
12 public class RestExceptionHandler implements ExceptionMapper<NotAllowedException> {
13
14     @Override
15     public Response toResponse(NotAllowedException e) {
16         Response response = Response.status(Response.Status.METHOD_NOT_ALLOWED).entity(e.getMessage()).build();
17         response.getHeaders().add("Content-Type", "text/plain");
18         return response;
19     }
20 }

然后在web.xml把这个加上

1     <context-param>
2         <param-name>resteasy.providers</param-name>
3         <param-value>com.cnblogs.yjmyzz.FastJsonProviderGBK,com.cnblogs.yjmyzz.RestExceptionHandler</param-value>
4     </context-param>

参考文章:

http://docs.jboss.org/resteasy/docs/3.1.2.Final/userguide/html_single/#builtinException

时间: 2024-09-28 01:28:10

resteasy经验谈的相关文章

经验谈系列 我们应该怎么给父母配电脑

经验谈系列 我们应该怎么给父母配电脑. 以下只是记录笔者这半年外地大学的一个插曲 作为一个IT宅,不可避免的要面对一个人生大事--上大学 在这期间可能我们的父母并不如我们一般喜欢电脑.QAQ 而在干干净净上大学之前我们需要干一件漂亮事情就是给父母留一台电脑. 首先需要明白需求 目前的时代可能我们用的最多的是手机而不是电脑 不管是android还是iphone 可能我们的父母更需要的是方便快捷的 手机 而不是电脑 而笔者的需求是母上需要每周用excel提交每周的计划.此外需要上q. 而父上的需求是

NOIP考纲总结+NOIP考前经验谈

NOIP考纲总结+NOIP考前经验谈 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 红色加粗表示特别重要,必须掌握 绿色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度 a.加法 b.减法 c.乘法(应该只会有高精乘单精) d.高精度除单精                 (后面c,d考的可能性较小,应该只考a,b) 排序算法 a.选择排序 b.插入排序 c.hash排序 d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)

Android App的设计架构:MVC,MVP,MVVM与架构经验谈

来源: Android App的设计架构:MVC,MVP,MVVM与架构经验谈 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于App的架构如何设计: 我的App需要应用这些设计架构吗? MVC,MVP等架构讲的是什么?区别是什么? 本文就来带你分析一下这几个架构的特性,优缺点,以及App架构设计中应该注意的问题. 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员

关于spring resteasy 集成jar包冲突问题

异常描述:Error creating bean with name 'resteasy.deployment' java.lang.IncompatibleClassChangeError:Implementing class 可能冲突的jar包 javax.ws.rs-api-2.0-m10.jar 和 jaxrs-api-3.0.4.Final.jar 删除javax.ws.rs-api-2.0-m10.jar (cxf使用的jar)即可.

软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程监督与控制篇

续:软件项目量化管理(CMMI高成熟度)实践经验谈--之概述篇 续:软件项目量化管理(CMMI高成熟度)实践经验谈--之项目管理过程策划篇 2.项目监督与控制 项目监控是围绕项目实施计划,跟踪进度.成本.质量.资源,掌握各项工作现状,以便进行适当的资源调配和进度调整,确定活动的开始和结束时间,并记录实际的进度情况,在一定情况下进行路径.风险.决策.度量.量化管理等方面的分析.在实施项目的过程中,要随时对项目进行跟踪监控,以使项目按计划规定的进度.技术指标完成,并提供现阶段工作的反馈信息,以利后续

spring+resteasy开发webservice服务

有一段时间没有更新博客,主要是最近一段时间自己比较迷茫,一直在思考自己以后的路该怎么走.希望大家也可以给我一些建议,谢谢!好了,回归正题,今天给大家带来的是spring+resteay开发webservice服务,不知道大家是否在这之前接触过webservice,我之前所了解的webservice是使用cxf还有axis2开发的,但是我觉得实现起来比较麻烦,而且不灵活,今天给大家介绍一种比较灵活的提供webservice服务的技术:resteasy.下面我重点讲解的resteasy常用的一些知识

关于使用spring mvc或者resteasy构建restful服务的差别与比较

resteasy 是 jboss的一个开源restful service实现参考.本文假设读者熟悉spring mvc,但是不了解或者没有使用过resteasy的用户. 其实一直以来,笔者实际都是使用spring mvc,对于研究resteasy没有兴趣.至于最近研究resteasy,纯属因为现在公司使用dubbox作为rpc框架,而dubbox使用resteasy作为REST实现库. 简单地说,resteasy核心就是一个servlet前端控制器,理念都一样. 应该来说,resteasy的优势

RestEasy 3.x 系列之四:使用Hibernate_Validator进行数据校验

使用Hibernate_Validator进行数据校验,好处不言而喻:规范统一,低耦合度. 1.pom.xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.1.Final</version> </dependency> <dependency&

acm省赛选拔组队赛经验谈

省赛组队赛已经进行5场了,过半了. 从曾经的不会组队到如今逐渐磨合,尽管每次都有遗憾,可是我认为我们一直在进步.有些失误是要记录下来下次不能再犯的! 经验: 1:上场開始一定要有人(英语能力和算法综合能力较强者)读全然部题目,对全部题目的难易程度做一个大概推断,以确定做题顺序,不要在比赛完了发现有水题没有看! 2:对于一个自己没有100%把握AC的题目,最好拉一个队友讲一下思路,假设队友认可了再写程序,防止一道题目花费了一个多小时代码敲到快完了发现思路是不可行的,并且这样在你一次不能AC的情况下