首页
在线工具
搜索
1
使用Metrics指标度量工具监控Java应用程序性能(Gauges, Counters, Histograms, Meters和 Timers实例)
2
如何将Virtualbox和VMware虚拟机相互转换
3
Jumpserver的MFA配置
4
Markdown正确使用姿势
5
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
86
篇与
的结果
2017-05-11
pring Data学习笔记
1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。 2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。 3、比方User类有两个属性,name跟address,就像百度知道,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。 5.3.9. Applying query hints 它需要一个JPA @QueryHint注释数组和一个布尔标志来潜在地禁用应用于在应用分页时触发的附加计数查询的提示 public interface PersonRepository extends Repository<User, Long> { List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname); // Enables the distinct flag for the query List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); // 为单个属性忽略所有的大小写 List<Person> findByLastnameIgnoreCase(String lastname); // 为所有的属性忽略大小写 List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); // Enabling static ORDER BY for a query List<Person> findByLastnameOrderByFirstnameAsc(String lastname); List<Person> findByLastnameOrderByFirstnameDesc(String lastname); } Spring数据库抽象中的中央界面是Repository(可能不是什么惊喜)。管理域类以及域类的id类型作为类型参数 在CrudRepository之上,有一个PagingAndSortingRepository抽象,可以添加其他方法来简化对实体的分页访问 Example 4. PagingAndSortingRepository public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); } Accessing the second page of User by a page size of 20 you could simply do something like this: PagingAndSortingRepository<User, Long> repository = // … get access to a bean Page<User> users = repository.findAll(new PageRequest(1, 20)); In addition to query methods, query derivation for both count and delete queries, is available. Spring Data JPA 1.11新特性 Projections: 实体可以一次性定义多个属性: Private String firstName, lastName; 如果想隐藏某个字段不查:定义 interface NoAddresses { String getFirstName(); String getLastName(); } 使用 interface PersonRepository extends CrudRepository<Person, Long> { NoAddresses findByFirstName(String firstName); } 重命名某个属性 interface FullNameAndCountry { @Value("#{target.firstName} #{target.lastName}") //指定属性来源 String getFullName(); @Value("#{target.address.country}") String getCountry(); } interface RenamedProperty { String getFirstName(); @Value("#{target.lastName}")//指定属性来源 String getName(); }
2017年05月11日
2017-05-09
SpringBoot Validator入门
大纲 入门例子 国际化 在代码中添加错误信息 入门例子 Validator 主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于 6 位,是否是纯数字的,等等。那么在 spring boot 怎么使用这么强大的校验框架呢。 在这里我们主要是使用注解进行学习。我们先说说我们的需求: 我们有一个 demo.html,在页面上有两个元素 姓名输入框,密码输入框,提交按钮。 提交到后台之后,使用 Validator 进行校验,然后如果存在错误,转发到 demo.html。 我们先编写一个实体类接收用户的输入,以及使用 Validator 注解校验: package com.kfit.demo; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; public class Demo { private long id; @NotEmpty(message="姓名不能为空") private String name; @NotEmpty(message="密码不能为空") @Length(min=6,message="密码长度不能小于6位") private String password; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Demo [id=" + id + ", name=" + name + ", password=" + password + "]"; } } 这个实体类在属性上加入了注解 @NotEmpty,@Length,那么常用的注解有: 约束注解名称 约束注解说明 @null 验证对象是否为空 @notnull 验证对象是否为非空 @asserttrue 验证 boolean 对象是否为 true @assertfalse 验证 boolean 对象是否为 false @min 验证 number 和 string 对象是否大等于指定的值 @max 验证 number 和 string 对象是否小等于指定的值 @decimalmin 验证 number 和 string 对象是否大等于指定的值,小数存在精度 @decimalmax 验证 number 和 string 对象是否小等于指定的值,小数存在精度 @size 验证对象(array,collection,map,string)长度是否在给定的范围之内 @digits 验证 number 和 string 的构成是否合法 @past 验证 date 和 calendar 对象是否在当前时间之前 @future 验证 date 和 calendar 对象是否在当前时间之后 @pattern 验证 string 对象是否符合正则表达式的规则 @Email 验证邮箱 实际例子: @size (min=3, max=20, message="用户名长度只能在3-20之间") @size (min=6, max=20, message="密码长度只能在6-20之间") @pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="邮件格式错误") @Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间") @Email(message = "比如输入正确的邮箱") @NotNull(message = "用户名称不能为空") @Max(value = 100, message = "年龄不能大于100岁") @Min(value= 18 ,message= "必须年满18岁!" ) @AssertTrue(message = "bln4 must is true") @AssertFalse(message = "blnf must is falase") @DecimalMax(value="100",message="decim最大值是100") @DecimalMin(value="100",message="decim最小值是100") @NotNull(message = "身份证不能为空") @Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误") 好了,这个不是我们这节的重点,这里简单说一下而已,那么之后我们应该怎么做呢?我们需要编写一个 Controller 进行访问的时候,能访问到 demo.html 以及点击提交按钮的处理方法,具体看如下代码: @RequestMapping("/demo") public String demo(Model model){ model.addAttribute("demo",new Demo()); return "/demo"; } @RequestMapping("/demoAdd") public String demoAdd(@Valid Demo demo,BindingResult result,Model model){ //有错误信息. model.addAttribute("demo",demo); if(result.hasErrors()){ List<ObjectError> list = result.getAllErrors(); for(ObjectError error:list){ System.out.println(error.getCode()+"---"+error.getArguments()+"---"+error.getDefaultMessage()); } return "demo"; } return "/demo"; } 这里的代码还是需要简单说明下,我们使用 @Valid 指定要校验的实体类。 BindingResult 所有的错误信息都会保存在这个类中,我们可以使用 result.hasErrors() 判断是否有错误信息,有的话,我们转发到我们原先访问的 hello.html,如果没有的话,我们正常应该是跳转到 list.html 之类的,这里只是为了方便测试跳回了 demo.html,但是如果没有任何错误信息的话,那么在页面上是不会显示错误信息的。 好了,接下来我们看看 demo.html 是怎么编写的吧? <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>hello spring boot</title> </head> <body> <form action="/demoAdd" method="post" th:object="${demo}"> <p>姓名:<input type="text" name="name" th:value="*{name}" /> </p> <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</p> <p>密码:<input type="text" name="password" th:value="*{password}" /> </p> <p th:if="${#fields.hasErrors('password')}" th:errors="*{password}">password Error</p> <p><button>提交</button></p> </form> </body> </html> 这里我们使用的 thymeleaf 进行展示数据的,使用 jsp 的代码需要用到 tag 标签,也能实现相同的效果,自行百度学习。这里核心代码就是: <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</p> 这句代码一旦后台有返回异常信息的话,就会显示 name 对应的 message,如果满足了两个条件的话,是会返回两个的,之间是用 <br/> 进行处理的,就如我们的 password 什么都不填写的情况下是会显示如下信息的: 密码: 密码不能为空 密码长度不能小于6位 国际化 在上一节我们就讲过国际化了,那么如何在 Validator 加入国际化呢,很简单的,只需要在国际化配置文件加入相应的配置如: demo.name = `name` is not empty. 这里需要注意的地方是: 必须放在 classes 目录下,而且必须用 ValidationMessages 这个名字 也就是文件名称需要命名为: ValidationMessages.properties ValidationMessages_en.properties 那么修改 Demo.java 文件: @NotEmpty(message="{demo.name}") 在代码中添加错误信息 有些代码是很难使用 Validator 的注解来实现的,那么我们怎么在返回的信息添加我们自己的判断呢,比如我们现在要求用户输入的 name 不能重复,那么势必我们会有这么一段代码: 如果存在 name,那么返回“该 name 已经存在了”。其实这个也是很简单,只需要一句话代码就可以添加自定义错误字段的信息了: result.rejectValue("name", "misFormat", "这个name已经注册过了!"); 当然在添加的时候,外层应该有一个 if(isExist(“name”)) 这样的代码,这里没有进行编写,就直接添加了,实际开发请自行从数据库获取,然后进行判断。
2017年05月09日
2017-04-28
笔记Swagger2 Api文档生成工具
Swagger2 Api文档生成工具笔记 Swagger2提供在线的html文档ui测试,如果想生成markdown文档或者alidoc格式文档需要依赖于第三方插件来做 https://github.com/Swagger2Markup/swagger2markup 第三方api文档生成工具 https://github.com/Swagger2Markup/spring-swagger2markup-demo D:/gems/addressable-2.3.8/data/unicode.data 在跑官方DEMO的时候如果报这个错误(issues上说mac下正常)在pom加上org.jruby 依赖 <dependencies> <dependency> <groupId>org.asciidoctor</groupId> <artifactId>asciidoctorj-pdf</artifactId> <version>1.5.0-alpha.10.1</version> </dependency> <dependency> <groupId>org.jruby</groupId> <artifactId>jruby-complete</artifactId> <version>1.7.21</version> </dependency> </dependencies> demo 需要注意:整合项目时,API接口编写需要根据官方提供的规范编写,不然会空指针异常,比如 @RequestMapping(value = "/object", method = POST) @ApiOperation(value = "请输入一个实体类对应的参数", response = User.class)//必须要respone @ApiResponses({@ApiResponse(code = 400, message = "Invalid Order")}) public ResponseEntity<String> placeOrder( @ApiParam(value = "传入一个实体类", required = true) User user) { return ok(""); } 如上是一个demo,但是在Controller只有一个时依然报空指针,需要加上两个DEMO或者想官方demo那样加更多Controller接口。因为还未详细查看api文档,所有后续需要进一步研究
2017年04月28日
2017-04-27
Docker Compose学习笔记
Docker Compose学习笔记 如果需要指定额外的编译镜像的 Dockefile 文件,可以通过该指令来指定。 例如 dockerfile: Dockerfile-alternate 注意,该指令不能跟 image 同时使用,否则 Compose 将不知道根据哪个指令来生成最终的服务镜像。 extends 基于其它模板文件进行扩展。 例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 common.yml。 # common.yml webapp: build: ./webapp environment: - DEBUG=false - SEND_EMAILS=false 再编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 # development.yml web: extends: file: common.yml service: webapp ports: - "8000:8000" links: - db environment: - DEBUG=true db: image: postgres 使用 extends 需要注意: 要避免出现循环依赖,例如 A 依赖 B,B 依赖 C,C 反过来依赖 A 的情况。 extends 不会继承 links 和 volumes_from 中定义的容器和数据卷资源。
2017年04月27日
2017-04-26
如何用 Docker 构建、运行、发布来一个 spring Boot 应用
如何用 Docker 构建、运行、发布来一个 spring Boot 应用。 Docker 简介 Docker 是一个 Linux 容器管理工具包,具备“社交”方面,允许用户发布容器的 image (镜像),并使用别人发布的 image。Docker image 是用于运行容器化进程的方案,在本文中,我们将构建一个简单的 Spring Boot 应用程序。 有关 Docker 的详细介绍,可以移步至 《简述 Docker》 前置条件 JDK 1.8+ Maven 3.0+ Docker 最新版。有关 Docker 在的安装,可以参阅 《Docker 在 CentOS 下的安装、使用》。 如果你的电脑不是 Linux 系统,最好装个虚拟机,在虚拟机里面装个 Linux ,因为 Docker 的依赖 Linux。 用 Maven 构建项目 创建目录结构 项目的目录结构因符合 Maven 的约定。 在 *nix 系统下执行 mkdir -p src/main/Java/docker_spring_boot ,生产如下结构 : └── src └── main └── java └── com └── lzh └── docker_spring_boot 创建 pom.xml 文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lzh</groupId> <artifactId>docker-spring-boot</artifactId> <packaging>jar</packaging> <version>1.0.0</version> <name>docker-spring-boot</name> <description>Getting started with Spring Boot and Docker</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- tag::plugin[] --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.3</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- end::plugin[] --> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <docker.image.prefix>lzh</docker.image.prefix> <spring.boot.version>1.3.3.RELEASE</spring.boot.version> </properties> </project> Spring Boot Maven plugin 提供了很多方便的功能: 它收集的类路径上所有 jar 文件,并构建成一个单一的、可运行的“über-jar”,这使得它更方便地执行和传输服务。 它搜索的 public static void main() 方法来标记为可运行的类。 它提供了一个内置的依赖解析器,用于设置版本号以匹配 Spring Boot 的依赖。您可以覆盖任何你想要的版本,但它会默认选择的 Boot 的版本集。 Spotify 的 docker-maven-plugin 插件是用于构建 Maven 的 Docker Image imageName指定了镜像的名字,本例为 lzh/docker-spring-boot dockerDirectory指定 Dockerfile 的位置 resources是指那些需要和 Dockerfile 放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入。本例,只需一个 jar 文件。 编写 Spring Boot 应用 编写一个简单的 Spring Boot 应用 : src/main/java/com/lzh/docker_spring_boot/Application.java: package com.lzh.docker_spring_boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 主应用入口 * @author lzh * @date 2017年3月19日 */ @SpringBootApplication @RestController public class Application { @RequestMapping("/") public String home() { return "Hello Docker World." + "<br />Welcome to SpringBoot</li>"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 解释下上面的代码: 类用 @SpringBootApplication @RestController 标识,可用 Spring MVC 来处理 Web 请求。 @RequestMapping 将 / 映射到 home() ,并将”Hello Docker World” 文本作为响应。 main() 方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用。 运行程序 使用 Maven 编译: mvn package 运行: java -jar target/docker-spring-boot-1.0.0.jar 访问项目 如果程序正确运行,浏览器访问 http://localhost:8080/,可以看到页面 “Hello Docker World.” 字样。 将项目容器化 Docker 使用 Dockerfile 文件格式来指定 image 层, 创建文件 src/main/docker/Dockerfile: FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD docker-spring-boot-1.0.0.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 解释下这个配置文件: VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录 项目的 jar 文件作为 “app.jar” 添加到容器的 ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source 构建 Docker Image 执行构建成为 docker image: mvn package docker:build 运行 运行 Docker Image docker run -p 8080:8080 -t lzh/docker-spring-boot [root@lzh spring-boot]# docker run -p 8080:8080 -t lzh/docker-spring-boot . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.3.RELEASE) 2016-03-20 08:45:51.276 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : Starting Application v1.0.0 on 048fb623038f with PID 1 (/app.jar started by root in /) 2016-03-20 08:45:51.289 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : No active profile set, falling back to default profiles: default 2016-03-20 08:45:51.722 INFO 1 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy 2016-03-20 08:45:54.874 INFO 1 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 2016-03-20 08:45:57.893 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2016-03-20 08:45:57.982 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2016-03-20 08:45:57.984 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.32 2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2016-03-20 08:45:58.473 INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 6877 ms 2016-03-20 08:45:59.672 INFO 1 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2016-03-20 08:45:59.695 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2016-03-20 08:45:59.701 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2016-03-20 08:45:59.703 INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter:'requestContextFilter' to: [/*] 2016-03-20 08:46:00.862 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@669af5fc: startup date [Sun Mar 20 08:45:51 GMT 2016]; root of context hierarchy 2016-03-20 08:46:01.166 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String com.lzh.docker_spring_boot.Application.home() 2016-03-20 08:46:01.189 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2016-03-20 08:46:01.190 INFO 1 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.302 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.438 INFO 1 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2016-03-20 08:46:01.833 INFO 1 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-03-20 08:46:02.332 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2016-03-20 08:46:02.343 INFO 1 --- [ main] c.lzh.docker_spring_boot.Application : Started Application in 13.194 seconds (JVM running for 15.828) 推送 image 到 Docker Hub 首先,你在 Docker Hub 要有注册账号,且创建了相应的库; 其次,docker 推送前,先要登录,否则报unauthorized: access to the requested resource is not authorized的错误 执行: docker login [root@lzhspring-boot]# docker login Username: root Password: Email: idinu@gmail.com WARNING: login credentials saved in /root/.docker/config.json Login Succeeded - 执行推送 docker push lzh/docker-spring-boot [root@lzhspring-boot]# docker push lzh/docker-spring-boot The push refers to a repository [docker.io/lzh/docker-spring-boot] 751d29eef02e: Layer already exists 4da3741f39c7: Pushed 5f70bf18a086: Layer already exists 7e4d0cb13643: Layer already exists 8f045733649f: Layer already exists latest: digest: sha256:eb4d5308ba1bb27489d808279e74784bda6761b3
2017年04月26日
1
...
9
10
11
...
18