MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.——https://mapstruct.org/
从官方定义来看,MapStruct类似于我们熟悉的BeanUtils, 是一个Bean的转换框架。
In contrast to other mapping frameworks MapStruct generates bean mappings at compile-time which ensures a high performance, allows for fast developer feedback and thorough error checking.——https://mapstruct.org/
@Data
@Builder
public class Source {
private Long id;
private Long age;
private String userNick;
}
转换目标类
@Data
public class Target {
private Long id;
private Long age;
private String userNick;
}
转换器
注意:Mapper是Mapstruct的注解。
@Mapper
public abstract class Converter {
public static Converter INSTANT = Mappers.getMapper(Converter.class);
public abstract Target convert(Source source);
}
使用示例
final Source source = Source.builder()
.id(1L)
.age(18L)
.userNick("Nick")
.build();
final Target target = Converter.INSTANT.convert(source);
System.out.println(target);
输出:
Target(id=1, age=18, userNick=Nick)
▐一一对应的字段名不一致、类型不一致
待转换的类
@Data
@Builder
public class Source {
private Long id;
private Long age;
private String userNick;
}
转换目标类
@Data
public class Target {
private Long id;
private Integer age;
private String nick;
}
转换目标类修改了age字段的类型,和userNick字段的名字,这两个类的字段仍然是一一对应的。
转换器
@Mapper
public abstract class Converter {
public static Converter INSTANT = Mappers.getMapper(Converter.class);
// 字段类型映射修改
@Mapping(source = "age", target = "age", resultType = Integer.class)
// 字段名映射修改
@Mapping(source = "userNick", target = "nick")
public abstract Target convert(Source source);
}
使用示例
final Source source = Source.builder()
.id(1L)
.age(18L)
.userNick("Nick")
.build();
final Target target = Converter.INSTANT.convert(source);
System.out.println(target);
@Mapper
public abstract class Converter {
public static Converter INSTANT = Mappers.getMapper(Converter.class);
@Mapping(target = "age", source = "extra", qualifiedByName = "extractAge")
@Mapping(target = "userNick", source = "extra", qualifiedByName = "extractUserNick")
public abstract VO convertToVO(DTO dto);
@Named("extractAge")
public Long extractAge(String extra) {
// 从extra中提取第一个值
return Long.valueOf(extra.split(",")[0]);
}
@Named("extractUserNick")
public String extractUserNick(String extra) {
// 从extra中提取第二个值
return extra.split(",")[1];
}
}
使用示例
final VO vo = VO.builder()
.id(1L)
.age(18L)
.userNick("Nick")
.build();
// 转为DTO
final DTO dto = Converter.INSTANT.convertToDTO(vo);
System.out.println(dto);
// 转回VO
final VO newVo = Converter.INSTANT.convertToVO(dto);
System.out.println(newVo);
@Mapper
public abstract class Converter {
public static Converter INSTANT = Mappers.getMapper(Converter.class);
/**
* extra字段解析后的buffer,避免多次重复解析
*/
private final ThreadLocal extraFieldBufferLocal = new ThreadLocal<>();
@Mapping(target = "age", source = "extra", qualifiedByName = "extractAge")
@Mapping(target = "userNick", source = "extra", qualifiedByName = "extractUserNick")
public abstract VO convertToVO(DTO dto);
@Named("extractAge")
public Long extractAge(String extra) {
if (extraFieldBufferLocal.get() == null) {
extraFieldBufferLocal.set(extractExtraField(extra));
}
return Long.valueOf(extraFieldBufferLocal.get()[0]);
}
@Named("extractUserNick")
public String extractUserNick(String extra) {
if (extraFieldBufferLocal.get() == null) {
extraFieldBufferLocal.set(extractExtraField(extra));
}
return extraFieldBufferLocal.get()[1];
}
/**
* 提取extra字段
*
* @param extra extra字段
* @return extra字段的提取结果
*/
public String[] extractExtraField(final String extra) {
return extra.split(",");
}
}
▐子类字段互转
常用于平铺类和嵌套类之间的转换,例如,前端需要将类中的所有字段打平,就可以参考以下示例代码。
互相转换的类
VO:
@Data
@Builder
public class VO {
private Long id;
private Date gmtCreate;
private Long age;
private String userNick;
}
DTO:
@Data
public class DTO {
private Long id;
private Date gmtCreate;
private Config config;
@Data
public static class Config{
private String age;
private String userNick;
}
}
final VO vo = VO.builder()
.id(1L)
.age(10L)
.gmtCreate(new Date())
.userNick("nick")
.build();
final DTO dto = Converter.INSTANT.convertToDTO(vo);
System.out.println(dto);
final VO newVo = Converter.INSTANT.convertToVO(dto);
System.out.println(newVo);
If specified, the compiler will detect annotation processors only in those classpath elements. If omitted, the default classpath is used to detect annotation processors. The detection itself depends on the configuration of annotationProcessors.
刚在一台IBM Xserver服务器上装了RedHat Linux Enterprise AS 4,为了提高网络的可靠性配置双网卡绑定。
一、环境描述
我的RedHat Linux Enterprise AS 4安装双口的Intel千兆网卡,通过ifconfig -a命令看到eth0和eth1两张网卡。
二、双网卡绑定步骤:
2.1 修改/etc/sysconfig/network
1.AdviceMethods.java
package com.bijian.study.spring.aop.schema;
public class AdviceMethods {
public void preGreeting() {
System.out.println("--how are you!--");
}
}
2.beans.x
包括Spark Streaming在内的实时计算数据可靠性指的是三种级别:
1. At most once,数据最多只能接受一次,有可能接收不到
2. At least once, 数据至少接受一次,有可能重复接收
3. Exactly once 数据保证被处理并且只被处理一次,
具体的多读几遍http://spark.apache.org/docs/lates
具体思路参见:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
import java.util.ArrayList;
import java.util.List;
public class MinStack {
//maybe we can use origin array rathe
日期转换函数的详细使用说明
DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. The&n