银行产品秒杀系统——项目笔记

1.如何让值为null的字段不返回给前端?

字段为null的值同样会返回给前端,会让交互变得很奇怪,效率也变低。

在application.yml文件中添加以下配置:

jackson:
    default-property-inclusion: non_null

2.Mybatis-plus怎么接收前端返回的一个数组,然后以JSON形式存入MySQL,并且可以从MySQL中正常取出这个JSON数据返回给前端?

在Java实体类用于接收该数组的字段上添加@TableField(typeHandler = JacksonTypeHandler.class)注解,这一注解可以解决第问题,然后在整个实体类上添加@TableName(value = "deposit_good", autoResultMap = true)注解(主要是autoResultMap = true),可以解决第二个问题。

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value="deposit_result",autoResultMap = true)
public class DepositResult implements Serializable {
   
    @TableId(type = IdType.AUTO)
    private Integer id; //结果id
    private Integer userId;
    private Integer goodId;
    private Integer result;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<Rule> reason;
    private String username;
    private String avatar;
    @TableField(exist = false)
    private String phone;
    private String reasonStr;
    private Date createTime;
}

3.如何完全解决跨域问题?

在项目中添加以下文件:

/**
 * 解决跨域问题,不能再在Controller上添加@CrossOrigin注解
 */

@Component
@WebFilter(urlPatterns = "/*", filterName = "CorsFilter")
public class CorsFilter implements Filter {
   

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
   
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Allow-Headers", "*");
        chain.doFilter(req, res);
    }


    @Override
    public void init(FilterConfig filterConfig) {
   
    }

    @Override
    public void destroy() {
   
    }

}

重点是在响应头中添加以下四项:

 response.setHeader("Access-Control-Allow-Origin", "*");
 response.setHeader("Access-Control-Allow-Credentials", "true");
 response.setHeader("Access-Control-Allow-Methods", "*");
 response.setHeader("Access-Control-Allow-Headers", "*");

4.如何在Springboot项目中添加一个全局变量?

一个全局变量可以用来控制两个文件的执行顺序等,非常方便。因为Springboot项目中可以自动创建对象,并且这个对象默认是单例的,所以我们可以创建一个Bean来解决这个问题。

@Component
@Data
public class GlobalVariable {
   
    private Boolean variable = false;
}
public class ScheduledTaskConfig{
   
	private final GlobalVariable globalVariable;
	
	@Autowired
	ScheduledTaskConfig(GlobalVariable globalVariable){
   
    this.globalVariable = globalVariable;
  }
  
  globalVariable.setVariable(true); // 这样就成功的设置了全局变量
  ...
}

5.如何往redis中快速插入大批量数据?

在本次项目中有从MySQL中将大批量数据插入到redis中,仅用jedis遍历插入会非常慢,这里可以使用Pipeline来解决这个问题

Jedis jedis = new Jedis();
Pipeline pipeline = jedis.pipelined;

//下面开始进行管道操作
pipeline.hset(...);
pipeline.hset(...);

pipeline.sync(); // 这个必须要加,否则数据会有丢失!	
pipeline.close(); // 关闭管道

jedis.close();  // 回收redis资源

注意,在同一线程中,不能在使用pipeline的同时使用jedis操作redis,否则会报以下错误:

redis.clients.jedis.exceptions.JedisDataException: Cannot use Jedis when in Pipeline. Please use Pipeline or reset jedis state

6.如何在Springboot项目启动后直接执行一段代码?

这种需求可以用于数据的初始化

@Component
public class initialConfig implements ApplicationRunner {
   
	//do something
}

7.如何直接返回给前端一个合理的时间格式?

json默认格式化时间都是时间戳,这样看起来很不明显,前端可能还需要再度格式化。使用@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 注解就可以解决。

public class ClientOrder extends PageSize implements Serializable {
   
    private Integer isLoans;
    private Integer orderId;
    private String goodName;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startTime;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endTime;
    private Integer status;
    private Integer userId;
    private Double totalPrice;
    private String name
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Noah Blake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值