@Configuration
public class FastJsonHttpMessageConverterConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2:添加fastJson的配置信息;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setDateFormat("yyyy" +
"-MM-dd HH-mm-ss");
//3处理中文乱码问题
List fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter> converter = fastJsonHttpMessageConverter;
Jackson2JsonMessageConverter converter1 = new Jackson2JsonMessageConverter();
return new HttpMessageConverters(converter);
}
}
将复杂的类型封装到一个Object中,这样json就可以实现转换了。
@Data
public class CombineObj {
private List skills;
private Card card;
}
过滤查询与排序
- 模糊查询
@Override
public List selectUserLike(String column,String like) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like(column,like);
List users = userMapper.selectList(queryWrapper);
return users;
}
- 时间升序
@Override
public List selectUserRangeTimeUpper(Timestamp timeBegin, Timestamp timeEnd) {
QueryWrapper qw = new QueryWrapper<>();
qw.ge("user_register_time",timeBegin);
qw.le("user_register_time",timeEnd);
qw.orderByAsc("user_register_time");
return userMapper.selectList(qw);
}
JSR303数据校验
使用@Email验证邮箱格式
使用@Pattern验证复杂数据格式
@Pattern(regexp = "^[1][3,5,7,8]\d{9}$",message = "电话格式有误")
private String userPhone;
@Email(message = "邮箱格式有误")
private String userEmail;
下表为常用数据校验注解

public R insertUser(@Valid User user,BindingResult result){
user.setUserRegisterTime(new Timestamp(System.currentTimeMillis()));
if (result.hasErrors()) {
//1.出现参数非法情况
StringBuffer errorMsg= new StringBuffer();
result.getFieldErrors().forEach(e->{
errorMsg.append(e.getDefaultMessage()+",");
});
return R.failed(errorMsg.toString());
} else {
//2.参数验证通过, 执行正常逻辑
String resp = userService.insertUser(user);
return R.ok(resp);
}
}
Rabbitmq组件创建
- Exchange:交换机,消息会全部发送到交换机,由交换机转发到队列。
@Bean(RabbitConstant.EXCHANGE_ROUTING_CARD)
public Exchange buildExchangeRoutingCard(){
return ExchangeBuilder.directExchange(RabbitConstant.EXCHANGE_ROUTING_CARD).durable(true).build();
}
- Queue:队列,存储到达的消息。可以给队列中的消息设置存活时间,队列也可以绑定一个交换机作为死信交换机。
@Bean(RabbitConstant.QUEUE_ROUTING_CARD)
public Queue buildQueueRoutingCard(){
return QueueBuilder.durable(RabbitConstant.QUEUE_ROUTING_CARD)
.deadLetterExchange(RabbitConstant.EXCHANGE_DEATH)
.deadLetterRoutingKey("death")
.ttl(10*1000)
.build();
}
- Binding:交换机和队列的绑定策略。可设置路由。
@Bean
public Binding basicBinding(@Qualifier(RabbitConstant.EXCHANGE_ROUTING_CARD) Exchange exchange,
@Qualifier(RabbitConstant.QUEUE_ROUTING_CARD) Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("card").noargs();
}
- SimpleRabbitListenerContainerFactory :监听器生产工厂,可以设置一些参数。
@Bean(RabbitConstant.SINGLE_LISTENER_FACTORY)
public SimpleRabbitListenerContainerFactory singleListener(){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setConcurrentConsumers(1);
factory.setMaxConcurrentConsumers(1);
//每次从队列中拉取消息的数量
factory.setPrefetchCount(1);
return factory;
}
- RabbitListener:消费者,监听队列,并处理队列中的消息。
@RabbitListener(queues = RabbitConstant.QUEUE_ROUTING_CARD,
containerFactory = RabbitConstant.SINGLE_LISTENER_FACTORY)
public void QueueListener(Message msg, Channel channel) throws IOException, InterruptedException {
long deliveryTag = msg.getMessageProperties().getDeliveryTag();
try {
//这里可以写消费者对消息的处理操作
System.out.println("消息处理中:n");
System.out.println(msg.getBody().toString());
channel.basicAck(deliveryTag,false);
} catch (Exception e) {
System.out.println("消息未被消费,加入死信队列中");
channel.basicNack(deliveryTag,false,false);
}
}
- RabbitTemplate :RabbitMQ的核心组件,可以通过RabbitTemplate 发送消息,也可以设置一些回调函数来处理丢失的数据。
@Bean
public RabbitTemplate rabbitTemplate(){
connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);
connectionFactory.setPublisherReturns(true);
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//检测信息能否成功的发送到交换机
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
// ack:当ack为false时数据发送失败,result为失败的原因
@Override
public void confirm(CorrelationData correlationData, boolean ack, String result) {
if(!ack){
System.out.println("数据未能发送到交换机");
System.out.println("原因是:"+result);
}else
{
System.out.println("数据成功发送到交换机");
}
}
});
//发送完消息后输出反馈信息
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("exchange转发数据到路由失败,执行回退操作");
}
});
return rabbitTemplate;
}



