编译环境和打包环境的问题、logback打印两次的问题、Jersey入参和出参

247 篇文章 1 订阅

今日遇到一个十分棘手的问题:在eclipse中编译没问题,但是gradle打包却通不过,经过同事的提醒才知道可能是环境的不同导致的。然后去检查才发现:eclipse使用的是JRE的lib,但是gradle的设置却用的是JDK-HOME的,但是JDK-HOME没有rt.jar,导致打包失败。

将JRE的lib/rt.jar拷贝过去即可。

 

另外一种gradle失败的情况是找不到中央库

 Cannot resolve external dependency mysql:mysql-connector-java:5.1.38 because no
 repositories are defined.
 Required by:
     :dzg-server-api:3.2.1

加上或者其他的即可

repositories {
  jcenter()
}

 

 

logback打印两次的问题是由于:<logger name="io.vertx.starter" level="debug" additivity="false"> 的属性additivity=true了,使打印信息传递到root去了,于是打印了两次。

 

 

Jersey可以通过注册ContainerRequestFilter和ContainerResponseFilter或者VertxRequestProcessor和VertxResponseProcessor来统一获取入参和出参。

 

public class RequestLogFilter implements ContainerRequestFilter{
    private static final SimpleDateFormat SDFLONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Logger logger = LoggerFactory.getLogger(RequestLogFilter.class);

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException{
        try{
            reportLog(requestContext);
        }
        catch(Exception e){
            e.printStackTrace();
            logger.error("获取日志信息失败" + e.getMessage());
        }
    }
    /**
     * @param requestContext
     * @throws IOException
     */
    public void reportLog(ContainerRequestContext requestContext) throws IOException{
        // 把所有请求的数据保存下来
        InputStream stream = requestContext.getEntityStream();
        byte[] bs = new byte[stream.available()];
        stream.read(bs);
        // 重新设置EntityStream
        ByteArrayInputStream bai = new ByteArrayInputStream(bs);
        requestContext.setEntityStream(bai);// 为了后面的处理,因为流只能被读一次。

        MultivaluedMap<String, String> headers = requestContext.getHeaders();
        MediaType type = requestContext.getMediaType();
        report(requestContext.getUriInfo().getRequestUri().toString(),headers, new String(bs), requestContext.getMethod(),
               type == null ? "unknown mediaType!" : type.toString(),
               requestContext.getUriInfo().getMatchedResources());
    }

    private void report(String url,MultivaluedMap<String , String> headers, String entity, String method, String mediaType, List<Object> list){
        StringBuilder sb = new StringBuilder("\nJersey resource report start-------- ")
                .append(SDFLONG.format(new Date())).append(" ------------------------------");
        sb.append("\nURL  : ").append(url);
        sb.append("\nMethod  : ").append(method);
        sb.append("\nMediaType  : ").append(mediaType);
        sb.append("\nHeaders  : ");
        for(Entry<String, List<String>> entry:headers.entrySet()){
            List<String> strs = entry.getValue();
            sb.append(entry.getKey()).append("->").append(strs.size()>1?strs:strs.get(0)).append("\r\n");
        }
        for(Object object : list){
            Class<? extends Object> clazz = object.getClass();
            sb.append("\nResource  : ").append(clazz.getName()).append(".(").append(clazz.getSimpleName())
                    .append(".java:1)");
        }
        sb.append("\nEntity/Params  : ").append(entity);
        sb.append("\nJersey resource report end-------------------------------------------------------------\n\n");
        logger.info(sb.toString());
    }

}

 

public class ResponseLogFilter implements ContainerResponseFilter{
    private static final SimpleDateFormat SDFLONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException{
        try{
            reportLog(responseContext);
        }
        catch(Exception e){
            e.printStackTrace();
            logger.error("获取日志信息失败" + e.getMessage());
        }
    }
    public void reportLog(ContainerResponseContext responseContext){
        Object entity = responseContext.getEntity();
        MultivaluedMap<String, String> headers = responseContext.getStringHeaders();
        MediaType type = responseContext.getMediaType();
        report(headers, entity, type == null ? "unknown mediaType!" : type.toString());
    }
    private void report(MultivaluedMap<String , String> headers, Object entity, String mediaType){
        StringBuilder sb = new StringBuilder("\nJersey response report start-------- ")
                .append(SDFLONG.format(new Date())).append(" ------------------------------");
        sb.append("\nMediaType  : ").append(mediaType);
        sb.append("\nHeaders  : ");
        for(Entry<String, List<String>> entry:headers.entrySet()){
            List<String> strs = entry.getValue();
            sb.append(entry.getKey()).append("->").append(strs.size()>1?strs:strs.get(0)).append("\r\n");
        }
        sb.append("Entity/Params  : ").append(entity);
        sb.append("\nJersey response report end-------------------------------------------------------------\n\n");
        logger.info(sb.toString());
    }
}
public class FilterBinder extends AbstractBinder{
    /**
     * Implement to provide binding definitions using the exposed binding
     * methods.
     */
    @Override
    protected void configure(){
        bind(RequestLogFilter.class).to(ContainerRequestFilter.class);
        bind(ResponseLogFilter.class).to(ContainerResponseFilter.class);
    }
}

 

public class RequestProcessor implements VertxRequestProcessor {
    private static final SimpleDateFormat SDFLONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Logger logger = LoggerFactory.getLogger(RequestProcessor.class);
    @Override
    public void process(HttpServerRequest vertxRequest,
                        ContainerRequest jerseyRequest, Handler<Void> done) {

        try{
            reportLog(jerseyRequest);
        }
        catch(Exception e){
            e.printStackTrace();
            logger.error("获取日志信息失败" + e.getMessage());
        }
        long now = System.currentTimeMillis();
        done.handle(null);
        long now2 = System.currentTimeMillis();
        logger.info(jerseyRequest.getUriInfo().getRequestUri().toString()+" 接口一共执行了 "+(now2-now) + "ms 时间\n");
    }
    /**
     * @param requestContext
     * @throws IOException
     */
    public void reportLog(ContainerRequestContext requestContext) throws IOException{
        // 把所有请求的数据保存下来
        InputStream stream = requestContext.getEntityStream();
        byte[] bs = new byte[stream.available()];
        stream.read(bs);
        // 重新设置EntityStream
        ByteArrayInputStream bai = new ByteArrayInputStream(bs);
        requestContext.setEntityStream(bai);// 为了后面的处理,因为流只能被读一次。

        MultivaluedMap<String, String> headers = requestContext.getHeaders();
        MediaType type = requestContext.getMediaType();
        report(requestContext.getUriInfo().getRequestUri().toString(),headers, new String(bs), requestContext.getMethod(),
               type == null ? "unknown mediaType!" : type.toString(),
               requestContext.getUriInfo().getMatchedResources());
    }

    private void report(String url,MultivaluedMap<String , String> headers, String entity, String method, String mediaType, List<Object> list){
        StringBuilder sb = new StringBuilder("\nJersey resource report start-------- ")
                .append(SDFLONG.format(new Date())).append(" ------------------------------");
        sb.append("\nURL  : ").append(url);
        sb.append("\nMethod  : ").append(method);
        sb.append("\nMediaType  : ").append(mediaType);
        sb.append("\nHeaders  : ");
        for(Entry<String, List<String>> entry:headers.entrySet()){
            List<String> strs = entry.getValue();
            sb.append(entry.getKey()).append("->").append(strs.size()>1?strs:strs.get(0)).append("\r\n");
        }
        for(Object object : list){
            Class<? extends Object> clazz = object.getClass();
            sb.append("\nResource  : ").append(clazz.getName()).append(".(").append(clazz.getSimpleName())
                    .append(".java:1)");
        }
        sb.append("\nEntity/Params  : ").append(entity);
        sb.append("\nJersey resource report end-------------------------------------------------------------\n");
        logger.info(sb.toString());
    }
}
public class ResponseProcessor implements VertxResponseProcessor{
    private static final SimpleDateFormat SDFLONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);

    @Override
    public void process(HttpServerResponse vertxResponse, ContainerResponse jerseyResponse){
        try{
            reportLog(jerseyResponse);
        }
        catch(Exception e){
            e.printStackTrace();
            logger.error("获取日志信息失败" + e.getMessage());
        }
    }
    public void reportLog(ContainerResponseContext responseContext){
        Object entity = responseContext.getEntity();
        MultivaluedMap<String, String> headers = responseContext.getStringHeaders();
        MediaType type = responseContext.getMediaType();
        report(headers, entity, type == null ? "unknown mediaType!" : type.toString());
    }
    private void report(MultivaluedMap<String , String> headers, Object entity, String mediaType){
        StringBuilder sb = new StringBuilder("\nJersey response report start-------- ")
                .append(SDFLONG.format(new Date())).append(" ------------------------------");
        sb.append("\nMediaType  : ").append(mediaType);
        sb.append("\nHeaders  : ");
        for(Entry<String, List<String>> entry:headers.entrySet()){
            List<String> strs = entry.getValue();
            sb.append(entry.getKey()).append("->").append(strs.size()>1?strs:strs.get(0)).append("\r\n");
        }
        sb.append("Entity/Params  : ").append(entity);
        sb.append("\nJersey response report end-------------------------------------------------------------\n");
        logger.info(sb.toString());
    }

}

 

/**
 * HK2 binder for injecting filters
 */
public class FilterBinder extends AbstractBinder{
    /**
     * Implement to provide binding definitions using the exposed binding
     * methods.
     */
    @Override
    protected void configure(){
        bind(RequestProcessor.class).to(VertxRequestProcessor.class);
        bind(ResponseProcessor.class).to(VertxResponseProcessor.class);
    }
}

 

使用Professor还可以统计接口返回时间

 

从gradle 2.12开始,可以使用compileOnly来引入类似servlet-api的jar包,可以达到只编译不引入的目的,类似maven的provided。

ngrok:让外网访问内网工程

https://www.ngrok.cc

frp内网穿透

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Logback和Log4j都是Java平台上的日志框架,它们各有优缺点,下面是它们的横向比较: 1. Logback的优点: - 配置简单:Logback的配置文件非常容易理解和配置,可以快速地进行日志配置。 - 性能高:Logback的性能比Log4j更好,可以处理更多的日志信息。 - 灵活性高:Logback可以通过编程方式进行配置,也可以通过XML文件进行配置。 - 可扩展性好:Logback提供了多种Appender和Layout,可以满足各种不同的日志需求。 - 支持SLF4J:Logback是SLF4J的实现,可以与其他框架无缝集成。 2. Logback的缺点: - 社区相对小:相比于Log4j,Logback的社区规模相对较小,可能会影响到一些开发者的选择。 - 需要熟悉XML:Logback的配置文件是基于XML格式的,需要熟悉XML的语法和规范。 3. Log4j的优点: - 成熟稳定:Log4j是Java平台上最早的日志框架之一,已经经过了长时间的发展和测试,非常成熟和稳定。 - 功能丰富:Log4j提供了非常丰富的日志功能,包括多种Appender和Layout等。 - 社区活跃:Log4j有一个庞大的社区,有很多的用户和开发者活跃在其中,可以及时得到支持和帮助。 4. Log4j的缺点: - 性能相对较差:相比于Logback,Log4j的性能稍差一些,可能会对系统性能产生一定的影响。 - 配置相对复杂:Log4j的配置文件相对于Logback来说稍微复杂一些,需要花费一些时间进行学习和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值