概念

  • Aspect 切面,指的是切分多个类的模块化的关注点,包括Pointcut或Advice

    1
    2
    3
    4
    @Aspect
    public class NotVeryUsefulAspect {
    }

阅读更多

问题

当使用Jackson进行json数据转换时,如果目标字段类型为TimeStamp并且要转换的值为空字串时会报空指针错误。

原因

下面是Timestamp反序列化器的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class TimestampDeserializer extends DateBasedDeserializer<Timestamp>
{
public TimestampDeserializer() { super(Timestamp.class); }
public TimestampDeserializer(TimestampDeserializer src, DateFormat df, String formatString) {
super(src, df, formatString);
}
@Override
protected TimestampDeserializer withDateFormat(DateFormat df, String formatString) {
return new TimestampDeserializer(this, df, formatString);
}
@Override
public java.sql.Timestamp deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException
{
return new Timestamp(_parseDate(jp, ctxt).getTime());
}
}

通过_parseDate方法转换为Date后,并没有判断是否转换成功而直接调用了getTime方法。

解决

添加一个自定义的TimeStamp的Deserializer,然后通过SimpleModule来注册到ObjectMapper中。

问题

Hibernate在使用OneToOne的反向关联或者使用主键关联(PrimaryKeyJoinColumn)时,会出来懒加载不起的作用的情况。究其原因,Hibernate的能够进行懒加载的前提是返回的关联对象是个代理对象。如果Hibernate不能确定关联的对象是否为空,那么他们不能直接返回代理对象,因为代理对象本身就是不为空的,它不得不去检查关联对象是否存在。但是用SELECT语句去检查存在性,还不如索性直接把查询结果返回,这也就导致了懒加载的失效。

阅读更多

下面的内容基于JPA的Hibernate实现进行讨论。

JPA的关联关系中的single-ended的关联(也就是ToOne)的模式fetch类型是的eager的。 在使用EntityMangerd#find方法进行查找时,这些关联会通过JOIN的方式被查询出来。但是如果使用Criteria API或者JPQL进行查询时,会发现针对这些关联产生了额外的SELECT查询,也就是通常我们所说的N+1的问题。

阅读更多

POSTMAN目前在我们团队中一直作为一个调用API的测试工具,但是由于我们的一直深入的使用它,导致使用的过程中存在不少很低效的问题。POSTMAN本身提供很多强大的功能,用好了它完全可以成为开发过程中比不可少的开发工具。

阅读更多

Spring Boot集成HATEOAS

JacksonAutoConfiguration会注册Primary ObjectMapper,这个ObjectMapper通过spring.jackson.*来配置。
JacksonAutoConfiguration配置完后会注册HypermediaAutoConfigurationHypermediaAutoConfiguration中会对Primary ObjectMapper注册Jackson2HalModule(由apply-to-primary-object-mapper决定)。

阅读更多

如果使用自定义Constraints,ErrorCode的是根据Constraints的名称按照优先度生成的{Constraints名}.{类名}.{字段名}{Constraints名}.{字段名}{Constraints名}.{字段类型}{Constraints名}。 在注解中定义的message会优先给Bean Validation解析,然后使用解析的结果作为Default Message,ErrorCode作为key,到Spring的MessageSource中再进行一次解析,获得最终的message template。

另外被验证字段本身的名称,再加上注解中除了messagegroupspayload属性定义的其他属性的值,会作为key再次到MessageSource进行解析,结果的结果作为变量传入到上面的message template中。

JPA对于关联属性的加载时机,可以通过FetchType来定义EAGER或者LAZY,但是对于加载的方式,是使用SELECT、SUBSELEC、JOIN则是由provider来决定的。JPA并没有提供相关的定义。例如,在使用Hibernate作为proider时,即便定义OneToMany的FetchTypeEAGER, Hibernate确实会在加载对象的时候同时加载关联对象,但是却是通过SELECT方式来实现的,也就是我们常说的N+1问题,对性能有较大的影响。

阅读更多

Fork me on GitHub