分类
Java 笔记 编程

Feign设置header无效

把原生Http Connection改为使用Feign请求调用外部接口,在方法上添加注解:

@PostMapping("{接口url}")
@Headers({"Content-Type: application/json"})

返回:

看来用@Headers设置的Content-Type没有生效。@Headers是Feign自带的注册,而@PostMapping是Spring MVC的注解。在@PostMapping中也有header属性,于是改为:

@PostMapping(value = "{接口url}", headers = {"Content-Type: application/json"})

问题依旧。

分类
Java

Mybatis Generator 1.4.0 发布

Mybatis Generator是一个自动代码工具,此版本相较于旧版本有很多重要的更新。

Mybatis Generator目前有5种运行模式,分别为:MyBatis3DynamicSql、MyBatis3Kotlin、MyBatis3、MyBatis3Simple、MyBatis3DynamicSqlV1。

<context id="MysqlTables" targetRuntime="MyBatis3DynamicSql" defaultModelType="flat">
 <!-- 省略中间 -->
</context>

1、MyBatis3、MyBatis3Simple是比较老的模式,通常生成mapper接口、model实体和XML文件(当javaClientGenerator type为 ANNOTATEDMAPPER 时不生成XML)。这两种模式生成的文件只需要依赖Mybatis3即可正常工作,但是对于很多操作不支持。如果想要使用数据库函数或者多表联合查询,这种模式下是不支持的,需要写额外的SQL。

2、MyBatis3DynamicSqlV1是比较新的模式。除了需要依赖Mybatis3以外,还需要mybatis-dynamic-sql才能正常工作。相比上面的老模式,这种模式更加方便。

分类
Java 编程

再见Mybatis Generator,你好Mybatis Plus

很久以前就使用Mybatis开发,Mybatis官方出品的Mybatis Generator能够自动生成Mapper和XML映射文件,提供基本的CRUD操作方法。

Mybatis Generator生成Entity同时可以生成Example,做为条件对像查询,避免写SQL。Example会跟据字段生成and,or,like等方法,也有eq,lt,gt,le,lt等比较方法和order by排序。

Mybatis Generator生成的SQL语句不提供数据库分页和排序,很多功能实现起来需要插件。我以前也写过分页插件,自定义封装了一个DaoService。在分页插件中增加了like查询,传入Entity跟据字段是否为空做条件用and查询。因为大多情况都是and查询,封装后很多操作不需要写SQL,也不需要用代码判断条件,提高了开发效率。

最近的项目用上了Mybatis Plus,虽说是第一次用,但很多东西与Mybatis Generator相似。Mybatis plus作者说,只在Mybatis上做增强,不做修改。因为这点我很钟意这个框架。

分类
Java

Maven PKIX path building failed

使用maven编辑,下载包时报PKIX path building failed错误

在maven设置中加入参数

-Dmaven.multiModuleProjectDirectory=$MAVEN_HOME
-Dmaven.wagon.http.ssl.insecure=true
-Dmaven.wagon.http.ssl.allowall=true
-Dmaven.wagon.http.ssl.ignore.validity.dates=true

再执行编译,正常下载依懒jar

参考:

https://blog.csdn.net/jsp_will/article/details/87951082

https://stackoverflow.com/questions/23904298/pkix-path-building-failed

分类
Java

常用Maven插件配置

自己项目中常用的编译打包插件配置,MARK一下,后续新项目直接copy就好。

项目编译

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>

项目打包JAR

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<!--不打包资源文件-->
		<excludes>
			<exclude>*.**</exclude>
			<exclude>*/*.xml</exclude>
		</excludes>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
				<!--MANIFEST.MF 中 Class-Path 加入前缀-->
				<classpathPrefix>lib/</classpathPrefix>
				<!--jar包不包含唯一版本标识-->
				<useUniqueVersions>false</useUniqueVersions>
				<!--指定入口类-->
				<mainClass>cn.payadd.merchant2.MerchantApplication</mainClass>
			</manifest>
			<manifestEntries>
				<!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
				<Class-Path>./resources/</Class-Path>
			</manifestEntries>
		</archive>
		<outputDirectory>${project.build.directory}</outputDirectory>
	</configuration>
</plugin>
分类
Java

Spring启动Could not resolve placeholder

除去properties文件路径错误、拼写错误外,出现”Could not resolve placeholder”很有可能是使用了多个PropertyPlaceholderConfigurer或者多个<context:property-placeholder>的原因。 一定要记住,不管是在一个Spring文件还是在多个Spring文件被统一load的情况下,直接写:

<context:property-placeholder location=""/>
<context:property-placeholder location=""/>

是错误的!

分类
Java

Mybatis Generator 不识别主键

错误场景描述:

在使用mybatis-Generator生成xml时,不生成Example,在<table>标签中添加enableCountByExample=”false”
enableDeleteByExample=”false”
enableSelectByExample=”false”
enableUpdateByExample=”false”

在生成xml文件时,应该有insert、insertSelective、selectByPrimaryKey、updateByPrimaryKeySelective、updateByPrimaryKey、deleteByPrimaryKey等方法,但是在生成的xml文件中只有insert、insertSelective。后来看xml文件中的resultMap节点里主键id使用的是result标签,而不是id标签。可能是主键没有被识别。

分类
Java

Quartz定时任务Cron表达式

cron表达式用于配置cronTrigger的实例。cron表达式实际上是由七个子表达式组成。这些表达式之间用空格分隔。

1.Seconds (秒)
2.Minutes(分)
3.Hours(小时)
4.Day-of-Month  (天)
5.Month(月)
6.Day-of-Week (周)
7.Year(年)

例:”0 0 12 ? * WED” 意思是:每个星期三的中午12点执行。

个别子表达式可以包含范围或者列表。例如:上面例子中的WED可以换成”MON-FRI”,”MON,WED,FRI”,甚至”MON-WED,SAT”。

子表达式范围:

1.Seconds (0~59)
2.Minutes (0~59)
3.Hours (0~23)
4.Day-of-Month (1~31,但是要注意有些月份没有31天)
5.Month (0~11,或者”JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC”)
6.Day-of-Week (1~7,1=SUN 或者”SUN, MON, TUE, WED, THU, FRI, SAT”)
7.Year (1970~2099)

分类
Java

Spring 过滤危险字符

项目中涉及到复杂查询,比如模糊查询。ORM框架往往不能很好处理,难免会遇到拼接字符串。而手动拼接的方式很容易让代码产生SQL注入漏洞。使用拦截器和过滤器,过滤请求中的危险字符,可以解决SQL注入攻击。

常用的请求有两种方式,一种是form表单提交,另一种是json格式。在Spring框架中处理这两种的方法也是有区别的。

过滤form表单

过滤表单提交的危险字符,使用的是过滤器,需要继承OncePerRequestFilter类。

在spring中,filter都默认继承OncePerRequestFilter。顾名思义,他能够确保在一次请求只通过一次filter,而不需要重复执行。

大家常识上都认为,一次请求本来就只过一次,为什么还要由此特别限定呢,实际上我们常识和实际的实现并不真的一样,经过一番查阅后,此方式是为了兼容不同的web container,特意而为之(jsr168),也就是说并不是所有的container都像我们期望的只过滤一次,servlet版本不同,表现也不同。

/**
* Filter base class that guarantees to be just executed once per request,
* on any servlet container. It provides a {@link #doFilterInternal}
* method with HttpServletRequest and HttpServletResponse arguments.
*
* <p>The {@link #getAlreadyFilteredAttributeName} method determines how
* to identify that a request is already filtered. The default implementation
* is based on the configured name of the concrete filter instance.
*
* @author Juergen Hoeller
* @since 06.12.2003
*/

如,servlet2.3与servlet2.4也有一定差异

在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file="/index.jsp"%>的情况。
到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过滤,但是有时候我们需要 forward的时候也用到Filter。

因此,为了兼容各种不同的运行环境和版本,默认filter继承OncePerRequestFilter是一个比较稳妥的选择。

以下是我的过滤器代码:

分类
Java

Maven引入第三方Jar

不是每个第三方jar都要交给Maven库管理。在开发中,常常会引用第三方库,放在WEB-INF/lib下发布。在Maven中,可以用以下方法引入这些Jar管理。

<dependency>
	<groupId>cn.payadd.dao</groupId>
	<artifactId>dao</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/dao-20190516.jar</systemPath>
</dependency>

打成war包时在build中加入jar资源路径

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-war-plugin</artifactId>
	<configuration>
		<webResources>
			<resource>
				<directory>src/main/webapp/WEB-INF/lib/</directory>
				<targetPath>WEB-INF/lib/</targetPath>
				<includes>
					<include>**/*.jar</include>
				</includes>
			</resource>
		</webResources>
	</configuration>
</plugin>

参考: https://blog.csdn.net/zhuyongzhen1219/article/details/79217986