月度归档: 2016 年 8 月

  • 使用spring-retry实现自动重试和错误异常管理

    经常会遇到一些有很高错误率的情况,比如需要从外部获取数据,而对应的网络条件又很一般,那么常常会出现一些错误和重试的情况,代码可能是这样的

    public class Demo {
        public Data featch() {
            int current = 0;
            Data data;
            while (current < MAX_TRY_LIMIT) {
                try {
                    data = service.call();
                } catch (Exception ex) {
                    index++;
                }
            }
            return data;
        }
    }

    如果项目代码中这种类似的比较多就有点难管理了,而且上面这段代码只处理了重试的情况,并没有超时控制,错误追溯等等。

    spring-retry是专为这种情况而生的,它被spring多个子项目使用,比如batch,integration等。

    @Service
    
  • 自定义Jackson Serializer实现复杂Json转换

    Jackson绝对是一个方便好用的工具,可以快速的在json和java object之间转换。Spring中也集成了Jackson,所以可以方便的自动赋予这个特性,比如使用restOperations消费API的时候。

    但是有时候要消费的API要求的json很诡异,比如创建新用户,对方要求的格式如下:

    {
    	"data": {
    		"attrs": {
    			"firstName": "FN",
    			"lastName": "LN"
    		},
    		"dateOfBirth": {
    			"detail": "1900-01-01"
    		}
    	}
    }

    如果直接使用,那么我们的类对象就有点复杂了,需要嵌套好几层。但是我们也清楚,业务需要的不过就是三个数据而已,姓;名;生日。

    这个时候就可以考虑自定义Serializer了。

    比如这样

    class CustomerSerializer extends JsonSerializer<Customer> {
        @Override
        public void serialize(Customer value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            
  • Spring中RestOperations的错误处理

    Spring提供了RestOperations来方便支持rest api的使用。不仅对于常用的方法语义有支持,对于常用的错误处理也有考虑,简单来说,用起来方便顺手,如果是返回json等常见格式,也能自动转为Java对象。

    RestOperations的默认错误处理由DefaultResponseErrorHandler负责,其中的方法hasError的返回值决定了是否将当前返回作为错误来对待。默认的实现是

    protected boolean hasError(HttpStatus statusCode) {
    		return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR ||
    				statusCode.series() == HttpStatus.Series.SERVER_ERROR);
    	}

    也就是说4和5开头的状态码看作错误。然后在直接将返回内容封装一下抛出

    @Override
    	public void handleError(ClientHttpResponse response) throws IOException {
    		HttpStatus statusCode = getHttpStatusCode(response);
    		switch (statusCode.series()) {
    			case CLIENT_ERROR:
    				throw new HttpClientErrorException(statusCode, response.getStatusText(),
    						response.getHeaders(), 
  • Spring Boot在Paypal中的应用

    看着分享,slideshare上的,可能需要外网访问权限

    http://www.slideshare.net/SpringCentral/spring-boot-paypal

     

    PayPal很有趣的地方在于虽然Spring体系已经成为一定程度上的事实标准,但是PayPal还是先采用的JSR标准,然后将Spring家族的一部分作为JSR的实现来使用。…