栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【8.4】功能增强

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【8.4】功能增强

配置HttpMessageConverter解决复杂json格式
@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;

下表为常用数据校验注解
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe08396575数据校验在Controller中的使用。

RequestMapping("/insertUser")
    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;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035966.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号