你貌似开启了广告屏蔽插件... 写博客不容易,希望能将广告过滤去掉,谢谢!

在spring-boot项目里集成netty-socketio实现服务器给页面推送消息通知

2018-08-20   阿辉   spring-boot学习笔记   spring-boot  

引入依赖

新建一个spring-boot项目,不多说,可以用IDEA或者在 start.spring.io 上创建 spring-boot 项目

netty-socketio 可以去github上找最新的版本 https://github.com/mrniko/netty-socketio

<dependency>
  <groupId>com.corundumstudio.socketio</groupId>
  <artifactId>netty-socketio</artifactId>
  <version>1.7.7</version>
</dependency>

解决SpringBoot项目里提交表单字段超过1000个异常 The number of parameters exceeded the maximum of 1000

2018-07-26   阿辉   spring-boot学习笔记   spring-boot  

java web容器在提交表单的时候有个保护机制,当表单字段超过1000个的时候会抛一个异常 The number of parameters exceeded the maximum of 1000 这么奇葩的问题居然被我碰到了,下面说一下解决办法,此方法适用 tomcat, jetty, undertow

  1. 减少字段数(跟没说一样,如果可以少点,就不会碰到这个问题了)
  2. 在项目里配置一下容器的 MAX_PARAMETERS 参数,默认是1000,给设置大点就好了
// 项目用的是undertow容器,下面是undertow的配置方法

@Bean
public UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() {
  UndertowEmbeddedServletContainerFactory undertowFactory = new UndertowEmbeddedServletContainerFactory();
  undertowFactory.addBuilderCustomizers(builder -> {
      builder.setServerOption(UndertowOptions.MAX_PARAMETERS, 10000);
  });
  return undertowFactory;
}

这段代码可以放在项目里任何地方,前提是要能被spring给扫描到,另外两个容器配置方法差不多,改一下方法名就可以了

配置好了,重启服务器这个异常就消失了


今天又碰到一个奇葩的问题,一个表单里提交的有字段,有数组(就是数据格式是一样的,对应到数据库里是多条数据),当这个数组里有257条时就会出现 index out of bounds 这原因是springmvc在处理表单的时候对表单内的数组类型的数据有长度限制,默认是256,当form表单提交的数组长度超过了256,就会出现问题,解决办法是将下面代码拷贝到处理表单的controller里,然后问题就解决了

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAutoGrowCollectionLimit(1024);
}

spring-boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息

2018-01-11   阿辉   spring-boot学习笔记   spring-boot hibernate-validator  

创建项目

使用IDEA创建一个spring-boot项目,依赖选上 web, validation, freemarker 即可

先看看效果

spring-boot开发项目加载自定义的YAML配置文件

2017-11-10   阿辉   spring-boot学习笔记   spring-boot  

现在用的spring-boot版本是1.5.x,在1.4.x的时候我记得配置自定义的yml配置文件是用 @ConfigurationProperties(locations={"classpath:myconfig.properties"})的方式指定的,

现在这个注解里已经没有 locations 这个属性了,网上搜了一圈,说是用 @PropertySource({"classpath:myconfig.properties"}) 注解来指定properties配置文件

因为application.properties修改application.yml是完全没有问题的,就想着把 myconfig.properties改myconfig.yml不就好了,就可以用yml格式来配置了,完美!!

spring-boot集成spring-security的oauth2实现github登录网站

2017-10-30   阿辉   spring-boot学习笔记   spring-boot spring-security  

spring-security 里自带了oauth2,正好YIIU里也用到了spring-security做权限部分,那为何不直接集成上第三方登录呢?

然后我开始了折腾

注意:本篇只折腾了spring-security oauth2的客户端部分,spring-security还可以搭建标准的oauth2服务端

Java格式化Markdown文档的工具库commonmark-java

2017-10-24   阿辉   spring-boot学习笔记   markdown commonmark  

之前在Java里格式化Markdown文档用的是Pegdown库,也挺好用的,不过还是没有commommark-java的可定制性强,下面对我使用commonmark-java做一下总结

spring-boot项目里的MongoDB的用法

2017-09-27   阿辉   spring-boot学习笔记   spring-boot mongodb  

前言:MySQL数据库很好用,但数据量到了千万以上了,想增加字段是非常痛苦的,这个在MongoDB里就不存在,字段想怎么加就怎么加,所以也就有了想在spring-boot里用MongoDB的想法了,Github上spring-projects里有关于使用MongoDB的demo,后面会给出链接

spring-boot里使用freemarker自定义标签

2017-06-08   阿辉   spring-boot学习笔记   spring-boot  

spring-boot开发网站使用freemarker里的自定义标签方法

创建类实现 TemplateDirectiveModel 类

@Component
public class UserTopicDirective implements TemplateDirectiveModel {

  @Autowired
  private UserService userService;
  @Autowired
  private TopicService topicService;

  @Override
  public void execute(Environment environment, Map map, TemplateModel[] templateModels,
                      TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
    Page<Topic> page = new PageImpl<>(new ArrayList<>());
    if (map.containsKey("username") && map.get("username") != null) {
      String username = map.get("username").toString();
      if (map.containsKey("p")) {
        int p = map.get("p") == null ? 1 : Integer.parseInt(map.get("p").toString());
        int limit = Integer.parseInt(map.get("limit").toString());
        User currentUser = userService.findByUsername(username);
        if (currentUser != null) {
          page = topicService.findByUser(p, limit, currentUser);
        }
      }
    }
    DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
    environment.setVariable("page", builder.build().wrap(page));
    templateDirectiveBody.render(environment.getOut());
  }
}

spring-boot项目打jar包运行,加载jar包外部的页面以及静态资源文件

2017-06-02   阿辉   spring-boot学习笔记   spring-boot  

之前看到过spring-boot开发的项目可以加载到放在jar包同级目录下的application.yml,就在想是否可以把src/main/resources/templatessrc/main/resources/static这两个目录下的文件都放到jar包同级目录下呢?答案是肯定的

项目打jar包

mvn clean compile package

完成了,在target目录下会有对应生成的jar文件