精华内容
下载资源
问答
  • 这个没啥毛病~后续工作之后掌握的是自定义一些专属的方法异常或者是项目自定义异常,来控制专属的方法或者操作报错后,便于区分报错类型,也可以根据不同的catch的异常来给前端传递不同的话述(通过不同的报错定位...

     

    以前在学习java的过程中,学到的知识是:如果代码块可能会抛出异常或者需要实现的代码已经有抛出的异常,需要用try 来包裹代码块, 用catch来捕获异常。这个没啥毛病~后续工作之后掌握的是自定义一些专属的方法异常或者是项目自定义异常,来控制专属的方法或者操作报错后,便于区分报错类型,也可以根据不同的catch到的异常来给前端传递不同的话述(通过不同的报错定位不同的问题,而不是统一的一句“提交失败”)。

    package com.company.exception;
    
    public class TestMainException {
        public static void main(String[] args) {
            System.out.println(A.A());
        }
    
        static class A {
            static class B {
                public static boolean B() {
                    return true;
                }
            }
    
            public static String A() {
                if (B.B()) {
                    return "true";
                } else {
                    return "false";
                }
            }
    
        }
    
    }

     原始代码打印: true

    修改加入异常之后,测试为:

    package com.company.exception;
    
    public class TestMainException {
        public static void main(String[] args) {
            try {
                System.out.println(A.A());
            } catch (CException e) {
                System.out.println(e.getMessage());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
        static class A {
            static class B {
                public static boolean B() throws Exception {
    
                    int i = 1/0;
                    return true;
                }
            }
    
            public static String A() throws Exception {
                try {
                    if (B.B()) {
                        return "true";
                    } else {
                        return "false";
                    }
                } catch (CException e) {
                    throw new CException("fk~ 居然失败了");
                }catch (Exception e) {
                    throw new Exception("我是个默认异常");
                }
            }
        }
    
        static class CException extends  Exception{
    
            public CException(String message) {
                super(message);
            }
        }
    }
    

    这个就会返回一个 “我是个默认异常” 这样的话述。

    如果我们在B方法中添加一些业务,同时想把业务信息的报错提示到前端,那么就得:

    package com.company.exception;
    
    public class TestMainException {
        public static void main(String[] args) {
            try {
                System.out.println(A.A());
            } catch (CException e) {
                System.out.println(e.getMessage());
                // return new AjaxResult(Status.STATUS_ERROR_UNKNOWN, i18nController.getMessage("approval.error"));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
        static class A {
            static class B {
                public static boolean B() throws Exception {
    
                    //                int i = 1/0;
                    // 业务代码
                    if (1 == 1) {
                        throw new CException("流程异常");
                    }
                    // 业务代码结束
                    return true;
                }
            }
    
            public static String A() throws Exception {
                if (B.B()) {
                    return "true";
                } else {
                    return "false";
                }
            }
        }
    
        static class CException extends Exception {
    
            public CException(String message) {
                super(message);
            }
        }
    }

    这里打印的就是 :流程异常

    哎呀说了那么多好像扯远了,今天的随笔主要是想说,B()方法 抛出异常的时候,以前是学到的是 throws Exception

    的时候需要抛出多个异常,方便上面方法捕获,但是其实只抛出一个Exception 上方也可以捕获多种不同异常,返回不同的报错信息。当然也可以写  throws CException, Exception{} 这样可能比较规范一些,代码阅读性更加友好~(但是idea 现在的规范是不希望你抛出多个异常的,像是这种CException,idea会直接因为你已经抛出了Exception 异常而把 CException 置灰掉。因为你都抛出了CException 的老爹~所以throws 多个异常的时候可以写一些不同类型的多种异常~) 

    总结一下,throws Exception 就可以了,上面可以根据不同的catch 而返回不同的话述,而且catch的时候需要有个 

    catch (Exception e) {  } 来兜底。剩的有些异常被漏掉~

    好了好了,叭叭一堆废话~

     

     

    展开全文
  • 返回的是null 代码正常可运行,但是页面的控制台的status 却是500,如果返回的是 new 一个 ModelAndView 的话,页面正常 ,状态码为200 ,但是其中是什么逻辑 ,我不清楚,为什么返回null的时候 页面控制台会报错500...
  • 本人写了一段代码来调用数据返回到前端。 原料:ES服务器,Javaweb项目。 ES选用的是7.9版本 下图是查询出来的ES结果集。 Java代码如下: import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j....

    背景:同事用ES做了数据处理放在服务器上。本人写了一段代码来调用数据返回到前端。
    原料:ES服务器,Javaweb项目。

    ES选用的是7.9版本
    在这里插入图片描述

    下图是查询出来的ES结果集。
    在这里插入图片描述
    Java代码如下(略去部分业务代码):

    
    import com.alibaba.fastjson.JSONObject; 
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.HttpHost;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.elasticsearch.search.sort.SortOrder;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Service;
    
    import java.io.IOException;
    
    /*
     * 查询elasticSearch上的数据,直接返回。
     */
    @Slf4j
    @Service
    @PropertySource("classpath:jdbc.properties")
    public class HXServiceImpl implements HXService {
    //从配置文件jdbc里取连接服务器的参数地址
        @Value("${es.hostname}")
        public String hostname;
        @Value("${es.port}")
        public int port;
    
        /*
          查询ElasticSearch。查询服务器上ES,默认返回按照日期倒序。查询资讯内容如下: 
             xxx_article_hot      新闻热度
             xxx_hx_news        新闻资讯
         */
        @Override
        public String queryInfo(String reqJson) throws IOException { 
    
            JSONObject jsonObject = JSONObject.parseObject(reqJson);
            String code = jsonObject.getString("code");
            String index = jsonObject.getString("index"); 
            String startDate = jsonObject.getString("startDate");
            String  endDate = jsonObject.getString("endDate");
    
            String rsp = null ;
          //  if(StringUtils.isEmpty(code)) return rsp;
          //根据传入index的类型,查询对应的资讯或新闻
            switch (index){
                
                case IndexConstants.HOT:
                        rsp =  this.search(IndexConstants.HOT,code,startDate,endDate);
                        break ;
                case  IndexConstants.NEWS:
                        rsp = this.search(IndexConstants.NEWS,code,startDate,endDate);
                        break;
                default :
                        break;
            }
            return rsp;
        }
    
    //如果查询条件里没有日期参数,那么就用这个方法。
    
        public String searchBySort(String index) throws IOException {
        //连接服务器的client
            RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                 //   
                    new HttpHost(hostname, port, "http")));
                //searchSourceBuilder类
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //查询所有数据
                searchSourceBuilder.query(QueryBuilders.matchAllQuery());
                //发布日期倒序排序Sort
            searchSourceBuilder.sort("publish_date", SortOrder.DESC);
    	//searchRequest 加入参数index和searchSourceBuilder
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(index);
            searchRequest.source(searchSourceBuilder);
            //执行client的search方法,拿到返回
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            return searchResponse.toString();
        }
    
     
    //如果有日期参数,那么就用这个方法
        public String search(String index , String code,String startDate,String endDate) throws IOException {
            RestHighLevelClient client = new RestHighLevelClient(RestClient.builder( 
                    new HttpHost(hostname, port, "http")));
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //queryBuilder的两个must方法,执行了两个查询
            BoolQueryBuilder mustBuilder = new BoolQueryBuilder();
            BoolQueryBuilder shouldBuilder = new BoolQueryBuilder();
    
            if(StringUtils.isBlank(code)){
                shouldBuilder.should(QueryBuilders.matchAllQuery());
            } else{
                shouldBuilder.should(QueryBuilders.matchQuery("company",code));
            }
    
            //时间范围的设定
            //生成DSL查询语句
          //  mustBuilder.must(QueryBuilders.rangeQuery("publish_date").from("2020-02-27T00:07Z").to("2020-12-27T00:07Z")).must(shouldBuilder);
            mustBuilder.must(QueryBuilders.rangeQuery("publish_date").from(startDate).to(endDate)).must(shouldBuilder);
    
    
            searchSourceBuilder.query(mustBuilder);
            searchSourceBuilder.sort("publish_date", SortOrder.DESC);
            //查询0到9999条,总计最多返回10000条
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(9999);
    
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(index);
            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            return searchResponse.toString();
        }
    
    
    }
    

    日期的请求参数要包括时区信息
    在这里插入图片描述
    补充:BugFix
    上述代码测试后,在服务器上报错连接用尽的问题,检查代码发现是每个线程请求进来都打开了一个client连接。
    思路:写了一个client连接的单例饿汉模式。如下图:

    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient; 
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties; 
    public class SingleHungaryClient { 
        private static int port;
        private static String hostname; 
        static
        {
            try {
                //获取当前类加载器
                ClassLoader classLoader=SingleHungaryClient.class.getClassLoader();
                //通过当前累加载器方法获得 文件jdbc.properties的一个输入流
                InputStream is=classLoader.getResourceAsStream("jdbc.properties");
                //创建一个Properties 对象
                Properties properties=new Properties();
                //加载输入流
                properties.load(is); 
                port=Integer.parseInt(properties.getProperty("es.port"));
                hostname=properties.getProperty("es.hostname"); 
            }
            catch (IOException e) {
                e.printStackTrace();
            } 
        } 
            private static RestHighLevelClient singleHungaryClient = new RestHighLevelClient(RestClient.builder(
                 //  new HttpHost("xx.xx.xx.xx", 9200, "http")));
               new HttpHost(hostname, port, "http")));  
        //将构造器设置为private禁止通过new进行实例化
        private SingleHungaryClient() { 
        }
        public static RestHighLevelClient getInstance() {
            return singleHungaryClient;
        }
    } 
    

    解析:
    因为spring框架注解加载在静态方法之后,为了保持参数可配置,因此使用了类加载器。
    ClassLoader类加载器:将java文件加载到jvm中 。获取类加载器:类名.class.getClassLoader()

    展开全文
  • 今天一天,都因为这个问题......崩溃 什么问题呢? ...5、但是呢,java返回json类型的数据,ajax却请求不,即不报错,也没有任何提示!!! 尝试 然后我用postman来测试后台的接口,完全没...

    今天一天,都因为这个问题......崩溃

    什么问题呢?

    1、我在做一个手机app

    2、我用java左后台,用Mysql+sqlyog做数据库

    3、前端和后台是由ajax连接的

    4、ajax可以进入后台,后台可以获取ajax传递过来的值

    5、但是呢,java返回json类型的数据,ajax却请求不到,即不报错,也没有任何提示!!!


    尝试

    然后我用postman来测试后台的接口,完全没有问题,有返回值

    如图示

     

     java后台也可以访问得到前台传递过来的数据

    所以我怀疑是前台ajax的问题、

    做过如下的尝试

    1、在function(ret,err){alert('我进来了');}     

         但是不起任何作用,没有任何弹框

    用的是api.ajax

    function ajax_login(user,ps){
      api.ajax({
          url: 'http://192.168.0.100:8080/jiekou/login.kk',
          method: 'post',
          charset:'utf-8',
          dataType:'JSON',
          returnAll:true,
          timeout:30,
          data: {
              values: {
                  username: user,
                  password: ps
              }
          }
      },function(ret, err){
          if (ret) {
         alert(JSON.stringify( ret ));
          } else {
              alert(JSON.stringify( err ) );
          }
      });
    
    }
    

    2、我以为api.ajax是有漏洞的,因为这个是apicloud下面的一个对象,我觉得apicloud不像java js 是比较有名有权威的东西

    我用了js原生的ajax,调试了半天,把json改成text,把text改成json,要么显示失败,要么就是跟之前一样没有任何返回值

     

    function ajax_login(user, ps) {
        alert("tyty:" + user + "密码:" + ps);
    $.ajax({
            method:'post',
            url: 'http://192.168.0.107:8080/jiekou/login.kk',
            async:true,
            dataType:"json",
            data: {
                    username: user,
                    password: ps
                  },
            timeout:3000,
           success: function(){  alert('成功');  },
           error: function () { alert('失败'); }
      })
    }

    3、百度了很久很久,后来发现一个博客

    是由于 提交的type是submit,而submit类型的按钮会导致页面刷新和ajax异步刷新相违背

    如果input type为submit时,你每次在提交的时候会发现所有输入框中数字全部清空了,说明页面重新刷新了,那么问题来了,ajax并不会导致页面刷新啊!真正导致页面刷新的是这个type为submit的input标签,强制要求页面刷新,因为页面刷新了,那么ajax返回的信息来到了一个完全陌生的页面,自然返回的是失败啊。