前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的开发日记(十)

我的开发日记(十)

作者头像
FunTester
发布2020-07-01 11:19:12
4360
发布2020-07-01 11:19:12
举报
文章被收录于专栏:FunTesterFunTester

最近开发基本都是在搬砖,补漏洞,今天正式部署到服务准备联调了,中间遇到了一些难点。

字符编码

由于时间紧迫没有来得及研究,只是根据日志和经验找到了解决方案。这里用到了非常基础的Java知识,幸好我没有忘干净。

首先,在build.gradle中要指定编码格式,如下:

代码语言:javascript
复制
tasks.withType(JavaCompile) {

    options.encoding = "UTF-8"

}

其次呢,在过滤器里面我是读去requestresponseServletOutputStream中的内容用来写入日志的,所以还需要会写到原来的对象中,这里就有一个坑,也需要指定编码格式。

代码语言:javascript
复制
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        ResponseWrapper responseWrapper = new ResponseWrapper(resp);
        RequestWrapper requestWrapper = new RequestWrapper(req);
        String url = requestWrapper.getRequestURI();
        String queryArgs = requestWrapper.getQueryString();
        queryArgs = queryArgs == null ? requestWrapper.getBody() : queryArgs;
        long start = Time.getTimeStamp();
        chain.doFilter(requestWrapper == null ? request : requestWrapper, responseWrapper);
        long end = Time.getTimeStamp();
        byte[] bytes = responseWrapper.getContent();
        String respContent = new String(bytes, Constant.UTF_8);
        logger.info("请求:{},耗时:{}ms,参数:{},响应:{}", url, end - start,queryArgs,respContent);
        response.getOutputStream().write(respContent.getBytes(Constant.UTF_8));
    }

数据库部分字段组合成json

还有一个难点,就是用例集运行结果详情的统计结果读取,数据库里面有四个字段,表示四种用例运行状态的用例数量。但是前端要求以json格式返回。本来想读取完结果之后再去处理,但是这个方案比较麻烦,首先我得创建两个对象,区分从数据库读取的信息和返回给前端的信息,还得将第一个对象的运行结果转成json格式set到第二个对象中。想了很多只想到一个可行的方案:将结果用concat拼接起来,然后使用resultMap将这个拼接的结果转成json格式,返回给前端。

typehandler

代码语言:javascript
复制
package com.okay.family.common.typehandler;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.okay.family.fun.frame.SourceCode;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

/**
 * 从数据库里面读取的map运行结果转化成json格式
 */
@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ResultArrayHandler extends BaseTypeHandler<JSONArray> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(parameter.toJSONString()));
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson) {
            JSONArray result = new JSONArray();
            List<String> asList = Arrays.asList(sqlJson.split(";"));
            asList.stream().forEach(x -> {
                String[] split = x.split("=", 2);
                result.add(SourceCode.getJson("text=" + split[0], "amount=" + split[1]));
            });
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null != sqlJson) {
            JSONArray result = new JSONArray();
            List<String> asList = Arrays.asList(sqlJson.split(";"));
            asList.stream().forEach(x -> {
                String[] split = x.split("=", 2);
                result.add(SourceCode.getJson("text=" + split[0], "amount=" + split[1]));
            });
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if (null != sqlJson) {
            JSONArray result = new JSONArray();
            List<String> asList = Arrays.asList(sqlJson.split(";"));
            asList.stream().forEach(x -> {
                String[] split = x.split("=", 2);
                result.add(SourceCode.getJson("text=" + split[0], "amount=" + split[1]));
            });
        }
        return null;

    }


}

mapper配置

  • resultMap
代码语言:javascript
复制
    <resultMap type="com.okay.family.common.bean.casecollect.response.CollectionRunResultDetailBean"
               id="CollectionRunResultDetailBean">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="envName" column="envName"/>
        <result property="runId" column="runId"/>
        <result property="caseNum" column="caseNum"/>
        <result property="result" column="result"/>
        <result property="startTime" column="start"/>
        <result property="endTime" column="end"/>
        <result property="list" column="list"
                typeHandler="com.okay.family.common.typehandler.ResultArrayHandler"/>
    </resultMap>

  • SQL语句
代码语言:javascript
复制
    <select id="getCollectionRunDetail" parameterType="java.lang.Integer"
            resultMap="CollectionRunResultDetailBean">
        select r.collectionId id,t.name,s.name envName,r.runId,r.caseNum,c.name result,start,end,concat("成功=",r.success,";失败=",r.fail,";无法运行=",r.unrun,";用户错误=",r.userError) list from
        <include refid="run_record"/>
        r left join
        <include refid="collection_status"/>
        c on r.result = c.id left join
        <include refid="table"/>
        t on r.collectionId = t.id left join
        <include refid="env"/>
        s on r.envId = s.id
        where runId = #{0}
    </select>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符编码
  • 数据库部分字段组合成json
    • typehandler
      • mapper配置
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档