• Spring boot学习整理


    目录:


    Springboot结合hbase

    首先在pom中添加依赖

            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>1.2.0</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>servlet-api-2.5</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>servlet-api-2.5-6.1.14</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>2.6.0</version>
                <exclusions>
                    <exclusion>
                        <artifactId>servlet-api</artifactId>
                        <groupId>javax.servlet</groupId>
                    </exclusion>
                </exclusions>
            </dependency>

    代码:

        @Autowired
        public SearchDaoImpl(AppSettings appSettings){
            this.appSettings = appSettings;
     
            Configuration HBASE_CONFIG = new Configuration();
            //与hbase/conf/hbase-site.xml中hbase.zookeeper.quorum配置的值相同
            HBASE_CONFIG.set("hbase.zookeeper.quorum", appSettings.getHbasename());
            //与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同
            HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", appSettings.getHbaseport());
            conf = HBaseConfiguration.create(HBASE_CONFIG);
        }

    Springboot结合elasticsearch

    1.maven设置

    springboot的版本是1.5.1.RELEASE。这个版本springboot使用的ES版本是2.4.4,其依赖的guava是16.0.1

    这里我们需要手动指定guava为18.0版本,否则会出现异常 java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concu‌rrent/Executor

    ...
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-elasticsearch</artifactId>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
    
    ....

    2.修改配置,在application.properties中添加以下内容

    ###########  es setting  ###########
    spring.data.elasticsearch.cluster-name=yq-cluster
    spring.data.elasticsearch.cluster-nodes=node3.test.cn:9300,node4.test.cn:9300,node5.test.cn:9300
    spring.data.elasticsearch.local=false
    spring.data.elasticsearch.repositories.enabled=true

    3.创建实体类(与ES中存储的内容格式对应)

    package com.product;
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.elasticsearch.annotations.Document;
    
    @Document(indexName = "yuqing", type = "emp", shards = 3, replicas = 1, refreshInterval = "-1")  
    public class MyClient {
        @Id
        private String id;
        
        private String first_name;
        
        private String last_name;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getFirst_name() {
            return first_name;
        }
    
        public void setFirst_name(String first_name) {
            this.first_name = first_name;
        }
    
        public String getLast_name() {
            return last_name;
        }
    
        public void setLast_name(String last_name) {
            this.last_name = last_name;
        }
    
    }

    4.建立资源库

    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    public interface ClientRepository extends ElasticsearchRepository<MyClient, String> {
    
    }

    5.服务接口

    public interface EsService {
        MyClient findClient(String id);
    }

    6.服务实现

    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class EsServiceImpl implements EsService {
    
        @Autowired
        private ClientRepository clientDao;
    
        private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(EsServiceImpl.class);
    
        public MyClient findClient(String id) {
            MyClient client = clientDao.findOne(id);
            LOG.info(" get cliente by id {} is {}", id, client);
            return client;
        }
    }

    7.应用

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping(value = "/es/")
    public class EsController {
        @Autowired
        private EsService esl;
    
        @RequestMapping(value = "test", method = RequestMethod.POST)
        public Object test(@RequestBody String id) {
            return esl.findClient(id);
        }
    }

    参考:Spring boot + elasticsearch的最简单实践

    在实际使用中要注意,安装的es版本与springboot中引用的es版本不能有差异不能太大。

    例如安装的是2.4.2的,那么api使用的2.4.x基本没问题,但如果引用5.x以上那肯定就不行了,会提示 None of the configured nodes are available

    所以使用时要先看一下当前 spring-data-elasticsearch 所使用的es版本

    Springboot结合RestTemplate处理Http请求

    先定义config bean

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
            return new RestTemplate(factory);
        }
    
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setReadTimeout(5000);// ms
            factory.setConnectTimeout(15000);// ms
            return factory;
        }
    }

    应用

    注:针对返回结果的序列化问题,目前没有找到方便快捷的方式,只好通过Object转HashMap的途径解决(虽然这种方法在属性多的情况下也比较复杂)

    RestTemplate.getForObject虽然可以指定为业务类,但是转换始终有问题。

    @RestController
    @EnableAutoConfiguration
    @Import(value = { RestTemplateConfig.class })
    public class SpringRestTemplateApp {
    
        @Autowired
        RestTemplate restTemplate;
    
        /*********** HTTP GET method *************/
        @RequestMapping("")
        public String hello() {
            String url = "http://localhost:8081/user";      
            HashMap<String,Object> user = (HashMap<String,Object>)restTemplate.getForObject(url, Object.class);        
            return user.get("name").toString();
        }
    
        @RequestMapping("/user")
        public User genUser() {
            User user = new User();
            user.setAge(18);
            user.setName("Ray");
            return user;
        }public class User {
            private int age;
            private String name;
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SpringRestTemplateApp.class, args);
        }
    }

    如果想将返回结果转换为实体对象(比如前面代码中的User),需要以字符串接收结果,然后再转换为对象。

    不过java的json工具(我用的jackson)貌似不是很给力,也或许是我使用不当,总感觉比C#的差多了,转换个json都好麻烦,尤其是复杂对象的时候(嵌套多层类,并且有List)

    先定义实体类,这里要注意的是,如果有嵌套的类,必须要定义为静态类

    public class Company {
    
        @JsonIgnoreProperties(ignoreUnknown=true)
        public static class Employee {
    
            public Employee () {
            }
    
            private String name;
    
            public String  getName() {
                return name;
            }
    
            public void setName(String  name) {
                this.name= name;
            }
        }
    
        public Company () {
        }
    
        private List<Employee> emps;
    
        public List<Employee> getEmployees() {
            return emps;
        }
    
        public void setEmployees(List<Employee> Employees) {
            this.emps= Employees;
        }
    }

    转换

    public class TransferTest {
        private static TransferTest instance;
    
        public static TransferTest instance() {
            if (instance == null) {
                instance = new TransferTest();
            }
            return instance;
        }
    
        public TransferTest() {
         //只需要定义一次 objectMapper
    = new ObjectMapper() { private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper = new com.fasterxml.jackson.databind.ObjectMapper(); public <T> T readValue(String value, Class<T> valueType) { try { return jacksonObjectMapper.readValue(value, valueType); } catch (IOException e) { throw new RuntimeException(e); } } public String writeValue(Object value) { try { return jacksonObjectMapper.writeValueAsString(value); } catch (Exception e) { throw new RuntimeException(e); } } }; } private Company doTransfer(String origin, String from, String to) throws UnirestException { String resp = restTemplate.getForObject(<url>,<data>,String.Class); //使用某种http工具类以字符串获取返回结果 Company data = objectMapper.readValue(str, Company.class); return data ; } }

    真的感觉好麻烦/(ㄒoㄒ)/~~

    Springboot的maven相关

    在将springboot项目发布的时候我们都是用maven打包成jar包,然后使用  java -jar xxx.jar  直接启动

    但是有时候发现执行之后会提示找不到启动程序。

    解决方法:在pom文件中添加以下内容

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.5.2.RELEASE</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

    Springboot的banner设定

    Springboot的banner很容易设置,只需要将banner.txt文件加到 src/main/resources 目录下即可

    这里给出一个码农保护神

    ${AnsiColor.BRIGHT_YELLOW}  
    ////////////////////////////////////////////////////////////////////  
    //                          _ooOoo_                               //  
    //                         o8888888o                              //  
    //                         88" . "88                              //  
    //                         (| ^_^ |)                              //  
    //                         O  =  /O                              //  
    //                      ____/`---'\____                           //  
    //                    .'  \|     |//  `.                         //  
    //                   /  \|||  :  |||//                          //  
    //                  /  _||||| -:- |||||-                         //  
    //                  |   | \  -  /// |   |                       //  
    //                  | \_|  ''---/''  |   |                       //  
    //                    .-\__  `-`  ___/-. /                       //  
    //                ___`. .'  /--.--  `. . ___                     //  
    //              ."" '<  `.___\_<|>_/___.'  >'"".                  //  
    //            | | :  `- \`.;` _ /`;.`/ - ` : | |                 //  
    //               `-.   \_ __ /__ _/   .-` /  /                 //  
    //      ========`-.____`-.___\_____/___.-`____.-'========         //  
    //                           `=---='                              //  
    //      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //  
    //            佛祖保佑       永不宕机     永无BUG                    //  
    ////////////////////////////////////////////////////////////////////  
    
    ${AnsiColor.BRIGHT_RED}  
    Application Version: ${application.version}${application.formatted-version}  
    Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}

    参考:https://blog.csdn.net/baochanghong/article/details/54286422 

  • 相关阅读:
    盘古越狱工具在用户空间的行为
    hdu 5538 House Building(长春现场赛——水题)
    html 锚点定位
    OOP版电子词典
    有趣的JavaScript原生数组函数
    &lt;LeetCode OJ&gt; 121. /122. Best Time to Buy and Sell Stock(I / II)
    hadoop 出现FATAL conf.Configuration: error parsing conf file,异常
    IT痴汉的工作现状10-Sprint Planning
    2015 Astar Contest
    无法使用BIPublisher开发报表
  • 原文地址:https://www.cnblogs.com/TiestoRay/p/6526448.html
Copyright © 2020-2023  润新知