springboot 处理Date的方案

spring boot 默认使用的jackson,并对默认做了配置。

当在web中返回Date类型数据,默认是Long的数字,当需要返回自定义格式的时候可以用如下的方法

======将对象的Date转成json,同样也能将json转成对象的Date=====

注: form表单提交的话是不能将字符串转成对象的Date的

1:(全局性的修改)

application.yml中修改默认的配置

修改字符串的格式

spring.jackson.date-formate = yyyy-MM-dd HH:mm:ss

这样修改后会有8小时的时差,还需要如下的配置

修改时区

spring.jackson.time-zone = GMT+8

2:(局部性的修改,会覆盖全局配置该属性的作用)

有是有需要对局部性的修改

在Date的属性上添加注解来实现,道理通1,格式和时区

@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

3:使用alibaba的Fastjson

启动类中注入bean

@Bean
public HttpMessageConverters messageConverter() {
    // 1. 需要定义一个converter转换消息的对象
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    // 2. 添加fastjson的配置信息,比如:是否需要格式化返回的json的数据
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    // 3. 在converter中添加配置信息
    fastJsonConfig.setDateFormat("yyyy/MM/dd HH:mm:ss");
    converter.setFastJsonConfig(fastJsonConfig);
    return new HttpMessageConverters(converter);
}

4: 重写mvc的方法

继承WebMvcConfigurerAdapter,重写方法 
WebMvcConfigurerAdapter 已经过期,改由 WebMvcConfigurationSupport 继承

可用重写的方法请参考该博客 https://blog.youkuaiyun.com/icarusliu/article/details/79477343

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        // 1.需要先定义一个convert 转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        // 2.添加fastJson的配置信息,比如,是否需要格式化返回的json数据
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        // 空值特别处理
        // WriteNullListAsEmpty 将Collection类型字段的字段空值输出为[]
        // WriteNullStringAsEmpty 将字符串类型字段的空值输出为空字符串 ""
        // WriteNullNumberAsZero 将数值类型字段的空值输出为0
        // WriteNullBooleanAsFalse 将Boolean类型字段的空值输出为false
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty);
        // 处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonConfig.setDateFormat("yyyy/MM/dd HH:mm:ss");
        // 3.在convert中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);
        // 4.将convert添加到converters当中
        converters.add(fastConverter);


    }
}

========================form表单提交转成对象的Date==================================

默认是能将 yyyy-MM-dd 格式的字符转转成日期类型

1:(局部方法)在对象的属性上添加数值解实现

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

在form表单提交的时候能将对应的字符串转成日期类型

2:自定义BaseController,,其余的contrller 来集成该类即可

public class BaseController {
    @InitBinder
    public void initBinder(ServletRequestDataBinder binder) {

       //格式yyyy-MM-dd HH:mm:ss,不能在更改了,灵活性差
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }

}

3:继承WebMvcConfigurerAdapter,重写方法 
WebMvcConfigurerAdapter 已经过期,改由 WebMvcConfigurationSupport 继承

重写addFormatters 方法,重写日期转换方法

@Override
    protected void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new Converter<String, Date>() {
            @Nullable
            @Override
            public Date convert(String source) {

                return convertString(source);
            }
        });

    }
convertString就是4里面的转换方法

4: 大招自定义DateConverterConfig实现spring提供的Converter重写里面的convert方法

@Component//交给spring 管理
public class DateConverterConfig implements Converter<String, Date> {
    private static final List<String> formarts = new ArrayList<>(4);
    static{
        formarts.add("yyyy-MM");
        formarts.add("yyyy-MM-dd");
        formarts.add("yyyy-MM-dd hh:mm");
        formarts.add("yyyy-MM-dd hh:mm:ss");
    }

    @Override
    public Date convert(String source) {
        String value = source.trim();
        if ("".equals(value)) {
            return null;
        }
        if(source.matches("^\\d{4}-\\d{1,2}$")){
            return parseDate(source, formarts.get(0));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
            return parseDate(source, formarts.get(1));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
            return parseDate(source, formarts.get(2));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
            return parseDate(source, formarts.get(3));
        }else {
            throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
        }
    }

    /**
     * 格式化日期
     * @param dateStr String 字符型日期
     * @param format String 格式
     * @return Date 日期
     */
    public  Date parseDate(String dateStr, String format) {
        Date date=null;
        try {
            DateFormat dateFormat = new SimpleDateFormat(format);
            date = dateFormat.parse(dateStr);
        } catch (Exception e) {

        }
        return date;
    }
}

也可参考这个额https://blog.youkuaiyun.com/xiangluer/article/details/81913137

 

最后添加一个方法

### 关于Spring Boot实现批量开票的解决方案 #### 使用批处理框架 为了高效地完成批量操作,可以考虑使用Spring Batch来管理大批量的数据处理任务。这不仅能够提高性能,还能简化错误恢复过程中的复杂度[^1]。 ```java @Configuration public class InvoiceBatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public ItemReader<Invoice> invoiceItemReader() { // 配置读取器逻辑... } @Bean public ItemProcessor<Invoice, Invoice> invoiceItemProcessor() { return new InvoiceProcessor(); } @Bean public ItemWriter<Invoice> invoiceItemWriter(DataSource dataSource) { JdbcBatchItemWriter<Invoice> writer = new JdbcBatchItemWriter<>(); writer.setSql("INSERT INTO invoices (id, amount, date) VALUES (:id, :amount, :date)"); writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setDataSource(dataSource); return writer; } @Bean public Job importUserJob(JobCompletionNotificationListener listener, Step step1) throws Exception { return jobBuilderFactory.get("importInvoices") .incrementer(new RunIdIncrementer()) .listener(listener) .flow(step1) .end() .build(); } } ``` #### 数据库事务控制 当涉及到多个发票记录的同时创建时,确保整个交易作为一个原子单元提交至关重要。为此,在服务层采用声明式事务管理是一种常见做法。这样可以在不影响业务逻辑的情况下轻松定义事务边界[^3]。 ```java @Service @Transactional public class InvoiceService { @PersistenceContext EntityManager entityManager; public void batchCreateInvoices(List<InvoiceDTO> dtos){ for (InvoiceDTO dto : dtos){ Invoice entity = convertToEntity(dto); entityManager.persist(entity); } } private Invoice convertToEntity(InvoiceDTO dto){ // DTO到实体转换逻辑... } } ``` #### Elasticsearch索引优化 对于需要快速检索大量发票的情况,还可以利用Elasticsearch作为辅助搜索引擎。通过设置合理的映射结构以及调整分片参数等方式提升查询效率[^2]。 ```xml <!-- pom.xml --> <dependencies> <!-- ... other dependencies... --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> </dependencies> ``` ```java @Repository public interface InvoiceRepository extends ElasticsearchRepository<Invoice, String> {} @Autowired private InvoiceRepository repository; // 执行批量保存至ES repository.saveAll(invoiceList); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值