首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,649 阅读
2
Mac打印机设置黑白打印
5,043 阅读
3
修改elementUI中el-table树形结构图标
4,946 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,705 阅读
5
intelliJ Idea 2022.2.X破解
4,455 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Mac
Spring Cloud
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
MySQL
.Net
Spring Cloud Alibaba
Mybatis-Plus
Typecho
jQuery
Java Script
IntelliJ IDEA
微信小程序
Laughing
累计撰写
629
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
629
篇与
的结果
2020-01-16
chrome升级安装后无法打开任何网页
我目前也遇到这个问题,重装也没用。暂时关闭沙盒模式凑活用。方法如下右键浏览器图标。属性-目标C:\GoogleChromePortable\App\Google Chrome\chrome.exe" -no-sandbox原来内容后面加上 -no-sandbox就可以。注意前面有个空格
2020年01月16日
1,152 阅读
0 评论
0 点赞
2019-11-01
Spring Boot手工开启、回滚事务
添加注解@Autowired PlatformTransactionManager platformTransactionManager; @Autowired TransactionDefinition transactionDefinition;启用事务TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);提交事务platformTransactionManager.commit(transactionStatus);回滚事务platformTransactionManager.rollback(transactionStatus);
2019年11月01日
1,291 阅读
0 评论
0 点赞
2019-08-09
Oracle父子结构转分级码结构
第一步增加列用于临时处理ALTER TABLE GSPUSERDOMAIN ADD fid varchar2(36) ALTER TABLE GSPUSERDOMAIN ADD pathtemp varchar2(36) 第二步插入父节点insert into GSPUSERDOMAIN(id,code,name,PATH,LAYER,isdetail,fid,pathtemp) select id,danweidh,mingcheng,ID,level,connect_by_isleaf,shangji,'' from JIGOU start with id in(select id from JIGOU where shangji IS NULL) connect by shangji=prior id order by shangji 第三步处理路径declare vInit VARCHAR2(36):=0; begin for i in 1..10 loop declare CURSOR emp_cur IS select * From GSPUSERDOMAIN where LAYER=i FOR UPDATE; BEGIN FOR emp_row IN emp_cur LOOP select(case when max(pathtemp)is null then '0' else max(pathtemp) end)+1 into vInit From GSPUSERDOMAIN where nvl(trim(GSPUSERDOMAIN.fid),' ')=nvl(trim(emp_row.fid),' '); vInit:=LPAD(vInit,4,'0'); UPDATE GSPUSERDOMAIN SET pathtemp=(select pathtemp from GSPUSERDOMAIN aa where aa.id=GSPUSERDOMAIN.fid)||vInit WHERE CURRENT OF emp_cur; END LOOP; end; end loop; end;第四步骤修改pathUPDATE GSPUSERDOMAIN SET PATH = pathtemp 最后一步,删除临时列alter table GSPUSERDOMAIN drop column fid; alter table GSPUSERDOMAIN drop column pathtemp;
2019年08月09日
1,536 阅读
0 评论
24 点赞
2019-07-29
VSCode配置Java运行环境相关设置
{ "editor.minimap.enabled": false, "window.zoomLevel": 0, "workbench.editor.enablePreview": false, "workbench.editor.enablePreviewFromQuickOpen": false, "editor.renderIndentGuides": false, "editor.highlightActiveIndentGuide": false, "java.home": "C:\\Java\\jdk1.8.0_181", "editor.fontSize": 18, "editor.lineHeight": 30, "maven.executable.path": "D:\\我的文档\\apache\\apache-maven-3.6.1\\bin\\mvn.cmd", "java.configuration.maven.userSettings": "D:\\我的文档\\apache\\apache-maven-3.6.1\\conf\\settings.xml", "maven.terminal.customEnv": [ { "environmentVariable": "JAVA_HOME", "value": "C:\\Java\\jdk1.8.0_181" } ], "terminal.integrated.shell.linux": "/bin/bash", "java.jdt.ls.vmargs": "-noverify -Xmx1G -XX:+UseG1GC -XX:+UseStringDeduplication", "explorer.confirmDelete": false, "java.configuration.checkProjectSettingsExclusions": false, "editor.suggestSelection": "first", "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue", "git.enableSmartCommit": true, "git.autofetch": true, "files.autoGuessEncoding": true, "workbench.iconTheme": "vscode-great-icons" }
2019年07月29日
1,436 阅读
0 评论
0 点赞
2019-07-28
Spring Boot原生异步请求API说明
异步请求api调用说明在编写实际代码之前,我们来了解下一些关于异步请求的api的调用说明。获取AsyncContext:根据HttpServletRequest对象获取AsyncContext asyncContext = request.startAsync(); 设置监听器:可设置其开始、完成、异常、超时等事件的回调处理public interface AsyncListener extends EventListener { void onComplete(AsyncEvent event) throws IOException; void onTimeout(AsyncEvent event) throws IOException; void onError(AsyncEvent event) throws IOException; void onStartAsync(AsyncEvent event) throws IOException; }说明onStartAsync:异步线程开始时调用onError:异步线程出错时调用onTimeout:异步线程执行超时调用onComplete:异步执行完毕时调用一般上,我们在超时或者异常时,会返回给前端相应的提示,比如说超时了,请再次请求等等,根据各业务进行自定义返回。同时,在异步调用完成时,一般需要执行一些清理工作或者其他相关操作。需要注意的是只有在调用request.startAsync前将监听器添加到AsyncContext,监听器的onStartAsync方法才会起作用,而调用startAsync前AsyncContext还不存在,所以第一次调用startAsync是不会被监听器中的onStartAsync方法捕获的,只有在超时后又重新开始的情况下onStartAsync方法才会起作用。设置超时:通过setTimeout方法设置,单位:毫秒。一定要设置超时时间,不能无限等待下去,不然和正常的请求就一样了。Servlet方式实现异步请求面已经提到,可通过HttpServletRequest对象中获得一个AsyncContext对象,该对象构成了异步处理的上下文。所以,我们来实际操作下。编写一个简单控制层package Cc.LiSen.Controllers; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.servlet.AsyncContext; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * ClassName: AsyncController <br/> * Description: <br/> * date: 2019/7/28 16:06<br/> * * @since JDK 1.8 */ @RestController @Api(tags = "测试异步请求") @ResponseBody @RequestMapping(value = "/AsyncTest") public class ServletAsyncController { private final static Logger logger = LoggerFactory.getLogger(ServletAsyncController.class); @PostMapping(value = "test") @ApiOperation(value = "测试异步请求") public void test(HttpServletRequest request, HttpServletResponse response) { AsyncContext context = request.startAsync(); context.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent asyncEvent) throws IOException { logger.info("执行完成"); } @Override public void onTimeout(AsyncEvent asyncEvent) throws IOException { logger.info("执行超时:"); } @Override public void onError(AsyncEvent asyncEvent) throws IOException { logger.info("发生错误:" + asyncEvent.getThrowable()); } @Override public void onStartAsync(AsyncEvent asyncEvent) throws IOException { logger.info("开始执行:"); } }); //设置超时 context.setTimeout(2000); //开启线程 context.start(new Runnable() { @Override public void run() { try{ Thread.sleep(100); logger.info("内部线程:"+Thread.currentThread().getName()); context.getResponse().setCharacterEncoding("UTF-8"); context.getResponse().setContentType("text/html;charset=utf-8"); context.getResponse().getWriter().println("这是内部线程"); //异步请求完成通知 //此时整个请求才完成 //其实可以利用此特性 进行多条消息的推送 把连接挂起。。 context.complete(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); //此时之类 request的线程连接已经释放了 logger.info("线程:" + Thread.currentThread().getName()); } }注意:异步请求时,可以利用ThreadPoolExecutor自定义个线程池使用过滤器时,需要加入asyncSupported为true配置,开启异步请求支持@WebServlet(urlPatterns = "/okong", asyncSupported = true ) public class AsyncServlet extends HttpServlet ...
2019年07月28日
1,359 阅读
0 评论
0 点赞
2019-07-28
Spring Boot自定义启动Banner
看烦了自带的Banner,动手修改一个属于自己的Banner,提现逼格的时候到了~哈哈,以下是官网给的配置指南:文字形式其实,替换很简单,只需要在classpath路径下创建一个banner.txt即可。具体的一些变量官网也有给出,具体如下:${AnsiColor.BRIGHT_YELLOW} //////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG // //////////////////////////////////////////////////////////////////// 关闭banner如果需要关闭banner,可以通过设置SpringApplicationBuilder来设置bannerMode为OFF。 SpringApplicationBuilder builder = new SpringApplicationBuilder(DemoApplication.class); builder.bannerMode(Banner.Mode.OFF); builder.run(args);
2019年07月28日
1,222 阅读
0 评论
1 点赞
2019-07-28
Spring Boot热部署
但当服务功能一多,启动速度缓慢时,还是配置个热部署比较方便。在SpringBoot中,只需要加入一个spring-boot-devtools即可。<!-- 增加热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>若不生效,可试着在打包工具spring-boot-maven-plugin下的configuration加入true看看,具体配置项如下:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build>
2019年07月28日
1,421 阅读
0 评论
0 点赞
2019-07-28
Spring Boot配置跨域
同源策略很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。同源策略是由Netscape提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,传统的跨域方案是JSONP,JSONP虽然能解决跨域但是有一个很大的局限性,那就是只支持GET请求,不支持其他类型的请求,而今天我们说的CORS(跨域源资源共享)(CORS,Cross-origin resource sharing)是一个W3C标准,它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是JSONP模式的现代版。在Spring框架中,对于CORS也提供了相应的解决方案,今天我们就来看看SpringBoot中如何实现CORS。前端请求<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <script src="jquery.min.js"></script> </head> <body> <div id="myDiv"></div> <script> $(document).ready(function () { $.ajax({ url: "http://localhost:8080/CrossOrigin", type:"post", async: false, success:function(data){ $("#myDiv").html(data); } }); }); </script> </body> </html>配置后端/** * @author laughing * @date 2020/9/26 * @site https://lisen.cc */ @RestController public class CorsController { /** * 方法配置跨域 * @return String */ @RequestMapping("/CrossOrigin") public String crossOrigin(){ return "crossOrigin"; } }打开前端页面,我们可以看一下,报错信息如下,也就是出现了跨域通过CrossOrigin配置跨域我们可以将@CrossOrigin注解到方法上,实现跨域请求,我们对后端方法改造如下:/** * @author laughing * @date 2020/9/26 * @site https://lisen.cc */ @RestController public class CorsController { /** * 方法配置跨域 * @return String */ @RequestMapping("/CrossOrigin") @CrossOrigin(origins = "http://localhost:1234") public String crossOrigin(){ return "crossOrigin"; } }通过CorsFilter配置跨域继续后端改造修改yaml文件,增加跨域配置信息#配置跨域 cors: allowedOrigin: - http://localhost:1234 allowCredentials: - true allowMethods: - GET - POST - PUT - DELETE maxAge: 7200 path: /** 增加CrosFilter配置文件package cc.lisen.cors.config; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import java.util.List; /** * 跨域配置 * * @author laughing * @date 2020/9/26 * @site https://lisen.cc */ @Configuration @ConfigurationProperties(prefix = "cors") @Getter @Setter public class CorsFilterConfig { private boolean allowCredentials; private List<String> allowedOrigin; private List<String> allowMethods; private long maxAge; private String path; /** * 配置跨域 * * @return CorsFilter */ @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); this.allowedOrigin.forEach(corsConfiguration::addAllowedOrigin); this.allowMethods.forEach(corsConfiguration::addAllowedMethod); corsConfiguration.setAllowCredentials(this.allowCredentials); corsConfiguration.setMaxAge(this.maxAge); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration(this.path, corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } } 增加请求/** * @author laughing * @date 2020/9/26 * @site https://lisen.cc */ @RestController public class CorsController { /** * 方法配置跨域 * @return String */ @RequestMapping("/CrossOrigin") // @CrossOrigin(origins = "http://localhost:1234") public String crossOrigin(){ return "crossOrigin"; } }再次请求,可以发现仍然能够正常访问通过WebMvcConfigurer配置跨域@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/cors/**") .allowedHeaders("*") .allowedMethods("*") .maxAge(1800) .allowedOrigins("http://localhost:8081"); } }
2019年07月28日
1,206 阅读
0 评论
0 点赞
2019-07-28
Spring Boot基于FileUpload包方式上传多个文件
添加万恶的依赖<!-- 附件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>修改配置文件,屏蔽servlet自带的附件上传#配置上传文件信息 http: multipart: # 最大支持文件大小 即单个文件大小 max-file-size: 2m # 最大支持请求大小 即一次性上传的总文件大小 max-request-size: 10m #取消Servlet自带的上传 enabled: false 增加控制器package Cc.LiSen.Controllers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; /** * ClassName: CommonsFileUpload <br/> * Description: <br/> * date: 2019/7/28 9:28<br/> * * @since JDK 1.8 */ @RestController @ResponseBody @RequestMapping(value = "/commonsfileupload") public class CommonsFileUpload { private static final Logger logger = LoggerFactory.getLogger(CommonsFileUpload.class); @PostMapping("/upload") public String Upload(@RequestParam MultipartFile[] files, @RequestParam String name, HttpServletRequest request) throws IOException { if (files.length <= 0) { return "请先选择要上传的附件"; } for (MultipartFile file : files) { if (file.isEmpty()) { return "文件信息不能为空"; } String fileType = file.getContentType(); String fileName = file.getName(); String fileOriginalName = file.getOriginalFilename(); //String fileSavePath = request.getServletContext().getRealPath("/static/sources"); //使用jar包,放到同级目录 File rootPath = new File(ResourceUtils.getURL("classpath:").getPath()); String fileSavePath = rootPath.getAbsolutePath()+"/static/upload/"; Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); fileSavePath = fileSavePath + simpleDateFormat.format(date); fileSavePath = fileSavePath + "/" + fileOriginalName; fileSavePath.replace("/", File.separator); File saveFile = new File(fileSavePath); if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } file.transferTo(saveFile); } return "上传成功"; } }
2019年07月28日
1,082 阅读
0 评论
0 点赞
2019-07-28
Spring Boot使用J2EE上传文件
温馨提示这种方式下,其实无需任何配置。只需按正常的web开发项目集成即可添加普通web项目依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>修改配置文件(可选)配置上传文件信息 http: multipart: # 最大支持文件大小 即单个文件大小 max-file-size: 2m # 最大支持请求大小 即一次性上传的总文件大小 max-request-size: 10m 使用package Cc.LiSen.Controllers; import com.sun.jmx.snmp.agent.SnmpMibAgent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.Date; @RestController public class J2EEFileUpload { private static final Logger logger = LoggerFactory.getLogger(J2EEFileUpload.class); @PostMapping("/upload") @ResponseBody public String UploadFile(@RequestParam MultipartFile file, HttpServletRequest request) throws IOException { if (file.isEmpty()) { return "上传文件不能为空"; } String fileType = file.getContentType(); String fileName = file.getName(); String originalName = file.getOriginalFilename(); long fileSize = file.getSize(); logger.info("原始文件名为:" + originalName); logger.info("服务器文件名为:" + fileName); logger.info("文件大小为:" + String.valueOf(fileSize)); String fileSavePath = request.getServletContext().getRealPath("/static/upload/"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-ddd"); fileSavePath = fileSavePath + simpleDateFormat.format(new Date())+"//"; fileSavePath = fileSavePath.replace("//",File.separator); File saveFile = new File(fileSavePath+originalName); if(!saveFile.getParentFile().exists()){ saveFile.getParentFile().mkdirs(); } file.transferTo(saveFile); return "上传成功"; } }
2019年07月28日
1,155 阅读
0 评论
0 点赞
2019-07-27
Spring Boot集成和使用Swagger2
Swagger简洁Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。万恶的添加依赖<!--添加swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency>修改application.yml增加swagger配置属性,用于配置是否启用#配置swagger是否开启 swagger: enabled: true 增加配置文件Swagger2Config.java主要是添加注解@EnableSwagger2和定义Docket的bean类。package Cc.LiSen.Configurations; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class Swagger2Config { @Value(value = "${swagger.enabled}") boolean swaggerEnabled; private ApiInfo apiInfo() { return new ApiInfoBuilder().title("李森的博客") .description("李森的博客") .contact(new Contact("李森的博客", "https://lisen.cc", "lisen@lisen.cc")) .version("0.1").build(); } @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) //是否开启 .enable(swaggerEnabled) .select() // 扫描的路径包 .apis(RequestHandlerSelectors.basePackage("Cc.LiSen.Api")) // 指定路径处理PathSelectors.any()代表所有的路径 .paths(PathSelectors.any()).build().pathMapping("/*"); } }修改实体类package Cc.LiSen.Pojos; import Cc.LiSen.Common.Utils.HtmlUtil; import com.fasterxml.jackson.annotation.JsonBackReference; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.extern.java.Log; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.util.Date; /** * ClassName: Post <br/> * Description: <br/> * date: 2019/7/23 9:25<br/> * * @since JDK 1.8 */ @Entity @Table(name = "posts") @ApiModel @Data public class Post implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") @ApiModelProperty(name = "id", dataType = "long", value = "内码", example = "1") @NotBlank(message = "内码不能为空") Long id; @Column(name = "post_author") Long postAuthor; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Column(name = "post_date") Date postDate; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Column(name = "post_date_gmt") Date postDateGmt; @Column(name = "post_content") String postContent; @Column(name = "post_title") String postTitle; @Column(name = "post_excerpt") String postExcerpt; @Column(name = "post_status", length = 20) String postStatus; @Column(name = "ping_status", length = 20) String pingStatus; @Column(name = "comment_status", length = 20) String commentStatus; @Column(name = "post_password", length = 255) String postPassword; @Column(name = "post_name") String postName; @Column(name = "to_ping") String toPing; @Column(name = "pinged") String pinged; @Column(name = "post_modified") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") String postModified; @Column(name = "post_modified_gmt") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") String postModifiedGmt; @Column(name = "post_content_filtered") String postContentFiltered; @Column(name = "post_parent") Long postParent; @Column(name = "guid") String guid; @Column(name = "menu_order") int menuOrder; @ManyToOne @JoinColumn(name = "postType") PostType postType; @Column(name = "comment_count") Long commentCount; public String getThumnailImage() { return HtmlUtil.getSingleImgStr(postContent); } @Column(insertable = false, updatable = false) String thumnailImage; } 修改控制器添加文档内容(一般上是在Controller,请求参数上进行注解。package Cc.LiSen.Api; import Cc.LiSen.Pojos.Post; import Cc.LiSen.Services.PostService; import com.sun.xml.internal.bind.v2.model.core.ID; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @ResponseBody @RestController @RequestMapping(value = "/post") @Api(tags = "文章操作Api") public class PostApi { @Autowired PostService postService; @GetMapping("/get/{id}") @ApiOperation("根据ID获取文章") @ApiImplicitParam(name = "id",value = "文章ID",required = true) public List<Post> getPost(@PathVariable long id) { if (StringUtils.isEmpty(id)) { return postService.getAllPosts(); } else { List<Post> posts = new ArrayList<>(); posts.add(postService.getPostByID(id)); return posts; } } ; } Swagger访问与使用api首页路径:http://127.0.0.1:8080/swagger-ui.html调试:点击需要访问的api列表,点击try it out!按钮,即可弹出一下页面:Swagger常用属性说明作用范围 API 使用位置对象属性 @ApiModelProperty 用在出入参数对象的字段上协议集描述 @Api 用于controller类上协议描述 @ApiOperation 用在controller的方法上Response集 @ApiResponses 用在controller的方法上Response @ApiResponse 用在 @ApiResponses里边非对象参数集 @ApiImplicitParams 用在controller的方法上非对象参数描述 @ApiImplicitParam 用在@ApiImplicitParams的方法里边描述返回对象的意义 @ApiModel 用在返回对象类上常用的注解@Api、@ApiOperation、@ApiModel、@ApiModelProperty示例中有进行标注,对于其他注解,大家可自动谷歌,毕竟常用的就这几个了。有了swagger之后,原本一些post请求需要postman这样的调试工具来进行发起,而现在直接在页面上就可以进行调试了,是不是很爽!对于服务的调用者而已,有了这份api文档也是一目了然,不需要和后端多少沟通成本,按着api说明进行前端开发即可。
2019年07月27日
1,196 阅读
0 评论
0 点赞
2019-07-26
Spring Boot自定义校验注解
自定义注解,主要是实现ConstraintValidator的处理类即可,这里已编写一个校验常量的注解为例:参数值只能为特定的值。自定义注解package Cc.LiSen.Validators; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * ClassName: EmailValidator <br/> * Description: <br/> * date: 2019/7/26 20:44<br/> * * @since JDK 1.8 */ @Constraint(validatedBy = EmailValidatorHandler.class) @Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface EmailValidator { String message() default "只能使用lisen.org后缀的邮箱"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String value(); }注解处理类package Cc.LiSen.Validators; import org.apache.tomcat.util.bcel.classfile.Constant; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Date; /** * ClassName: EmailValidatorHandler <br/> * Description: <br/> * date: 2019/7/26 19:54<br/> * * @since JDK 1.8 */ public class EmailValidatorHandler implements ConstraintValidator<EmailValidator, String> { private String regEmail; @Override public void initialize(EmailValidator constraintAnnotation) { regEmail = constraintAnnotation.value(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return regEmail.endsWith(value); } }使用注解package Cc.LiSen.Pojos; import Cc.LiSen.Validators.EmailValidator; import lombok.Data; import org.hibernate.annotations.ColumnDefault; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.URL; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.util.Date; /** * ClassName: User <br/> * Description: <br/> * date: 2019/7/21 11:38<br/> * * @since JDK 1.8 */ @Table(name="Users") @Entity public class User { public long getID() { return ID; } public void setID(long ID) { this.ID = ID; } public String getUserLogin() { return userLogin; } public void setUserLogin(String userLogin) { this.userLogin = userLogin; } public String getUserPass() { return userPass; } public void setUserPass(String userPass) { this.userPass = userPass; } public String getUserNicename() { return userNicename; } public void setUserNicename(String userNicename) { this.userNicename = userNicename; } public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } public String getUserUrl() { return userUrl; } public void setUserUrl(String userUrl) { this.userUrl = userUrl; } public Date getUserRegistered() { return userRegistered; } public void setUserRegistered(Date userRegistered) { this.userRegistered = userRegistered; } public String getUserActivation_key() { return userActivation_key; } public void setUserActivation_key(String userActivation_key) { this.userActivation_key = userActivation_key; } public int getUserStatus() { return userStatus; } public void setUserStatus(int userStatus) { this.userStatus = userStatus; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public long ID; @Column(name = "user_login",length = (60)) private String userLogin; private String userPass; private String userNicename; @Length(min = 0,max = 10,message = "邮箱长度不能超过10位") @EmailValidator(value = "@lisen.org") private String userEmail; @URL private String userUrl; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date userRegistered; private String userActivation_key; private int userStatus; private String displayName; } 使用@RequestMapping("/page/{num}") ModelAndView GetArticleByPage(@PathVariable int num) { List<PostType> postTypesTop = postTypeService.findTopMenu(1, "posttype_order"); List<PostType> postTypesNav = postTypeService.findTopMenu(0, "posttype_order"); Page<Post> postPage = postService.findAllPosts(num, 10, Sort.Direction.DESC, new String[]{"postDate"}); int pageNum = postPage.getTotalPages(); int count = postPage.getNumber(); ModelMap map = new ModelMap(); map.addAttribute("pageNum", pageNum); if (pageNum > num) { map.addAttribute("nextPage", num + 1); } map.put("posttypestop", postTypesTop); map.put("posttypesnav", postTypesNav); map.put("posts", postPage.getContent()); return new ModelAndView("index", map); }
2019年07月26日
1,440 阅读
1 评论
0 点赞
1
...
36
37
38
...
53