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-19 20:32:12

resteasy经验谈的相关文章

王通:网络出版赚钱经验谈

网络|赚钱 王通:网络出版赚钱经验谈用传统出版社,我发行了一本印刷版书,从写书到发行,用了一年的心血,仅仅收到了几千元稿费. l 利用互联网发行,我发行的第一本电子书,从写书到发行,用了不到一个月,两年下来,这本书已经给我增加了百万收入. 同样是发行?效率和收入的差距如此的大,可以看出网络出版发行的魅力了. 王朔最近打算抛弃出版社了,欲通过网络发行自己的小说赚钱,其他作家可能也都打算来尝试.尝试意味着是摸着石头过河,操作起来有可能因缺乏经验而走很多弯路.王通在此分享一下自己在这方面相对比较成熟的

网站推广经验谈

推广|网站推广 网站推广经验谈  一个网站无论做得如何完美,如果不将它推广开来,靠推广来提高它的访问量,那么,这个网站只能说是做给自己看的,它存在的意义就大为逊色了.可如何推广,如何提升自己网站的访问量,并且能够吸引客户的眼球,让他从今天的新客户变成明天的老客户?结合笔者自身经验,今天就从内部因素和外部因素两个方面来聊聊这个问题. 一.内部因素    首先,得有一个内容.版面.规划.设计都差不多的网页,这些东西作为你网站的门面,一定要注意主页的美工设计是否到位,整体的框架结构是否合理,页面上所用

数据库设计经验谈 一 (引)

设计|数据|数据库|数据库设计  数据库设计经验谈 作者: 水若寒 一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键.如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分.有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述.不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲.插入一些数据库设计心得: 一. 设计思想对许多程序员

路由表信息经验谈

当前的路由: destination 目的网段 mask 子网掩码 interface 到达该目的地的本路由器的出口ip gateway 下一跳路由器入口的ip,路由器通过interface和gateway定义一调到下一个路由器的链路,通常情况下,interface和gateway是同一网段的metric 跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由. 源码: Active Routes: Network Destination

2020年业务峰值提前3年出现,中国邮政上云实战经验谈

"情系万家,信达天下",中国邮政一直都在身边,与我们的工作和生活密不可分.但很少有人知道,作为世界邮政排名第2,世界500强第105位的中国邮政的信息化建设历程也很长.3月13日"2016云栖奖"获奖者采访时,谈到这些历程,中国邮政集团信息技术局总经理石纯斌如数家珍:"中国邮政集团信息技术局已经成立近20年,承担着中国邮政集团信息化工作.与邮政业务一起发展起来的还有历经'从无到有,从有到全,从全到好'三个阶段的信息化建设." **[视频采访]20

&quot;云计算+移动互联网&quot;时代IT管理经验谈

文章讲的是"云计算+移动互联网"时代IT管理经验谈,IT架构演进从主机/傻瓜终端-〉C/S结构-〉B/S结构-〉云/端结构.数据中心的云服务化,以及手机办公.手机支付和手机社交宣告了云计算和移动互联网时代的来临.对于企业来讲,怎样管理云计算和移动互联网才能确保安全享用新IT的成果,而且防患于未然?企业的决策层.管理层或操作层的管理分别面临怎样的变革?为解析云计算和移动互联网时代it管理的现状和分析之前景,IT168企业组邀请到首席IT管理专家&祝成科技的薛君敖博士,来帮助我们拨

快速了解RESTEasy

什么是 RESTEasy RESTEasy 是 JBoss 的一个开源项目,提供各种框架帮助你构建 RESTful Web Services 和 RESTful Java 应用程序.它是 JAX-RS 规范的一个完整实现并通过 JCP 认证.作为一个 JBOSS 的项目,它当然能和 JBOSS 应用服务器很好地集成在一起. 但是,它也能在任何运行 JDK5 或以上版本的 Servlet 容器中运行.RESTEasy 还提供一个 RESTEasy JAX-RS 客户端调用框架,能够很方便与 EJB

WinCE USB驱动开发经验谈

WinCE USB驱动开发经验谈 随着USB2.0设备的不断增加,USB设备驱动开发在嵌入式开发中变的越来越重要.Windows CE支持USB 2.0更是对这一波新技术浪潮产生巨大的推动.近期我负责一个这样的项目,在WinCE下开发USB接口的外围设备驱动.当时做这个项目花费了我相当多的时间和精力,错走许多冤枉路使我精疲力尽. 项目需求是在已调好的ARM9板子上开发USB WiFi无线网卡的驱动程序,具体要求是驱动程序平台是WinCE,CPU类型支持ARM构架,要能比较方便地移植到X86:驱动

RESTEasy中的通用异常处理ExceptionMapper

RESTEasy是JBoss提供的一个Restful基础框架,使用它我们可以很方便的构建我们的Restful服务,而且它也完全符合Java的JAX-RS2.0标准,很多第三方Restful框架也都是基于RESTEasy开发的. 在任何框架中都不可避免的涉及到异常处理,Restful框架也是如此.按照我们一般传统异常处理方式,在Restful的最外层,我们一般会对所有的业务调用都加上try catch,以免异常被用户接收到,比如我们有这么一个Restful服务: import javax.ws.r