首页
在线工具
搜索
1
如何将Virtualbox和VMware虚拟机相互转换
2
使用Metrics指标度量工具监控Java应用程序性能(Gauges, Counters, Histograms, Meters和 Timers实例)
3
Typora+Picgo图床使用
4
Markdown正确使用姿势
5
Jumpserver的MFA配置
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
87
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
87
篇与
的结果
2017-07-02
整合spring security oauth2的时候如果碰到Possible CSRF detected - state parameter was present but no state could be found
解决方案:https://github.com/spring-projects/spring-security-oauth/issues/322 问题所在: The problem is the session then. You have 2 servers running on localhost, on different ports, but cookies don't record the host, only the path, and both are on the root path "/" so they are sharing a cookie. Put one of them in a sub context (e.g. using server.contextPath=/auth for the auth server) and it should work I think. 您有2台服务器在本地主机上运行,不同的端口,但cookie不记录主机,只有路径,并且都在根路径“/”,所以他们共享一个cookie。将其中一个放在子上下文中(例如,使用server.contextPath = / auth进行认证服务器),它应该可以工作。
2017年07月02日
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日
1
...
9
10
11
...
18