代码之家  ›  专栏  ›  技术社区  ›  drenda

Spring MVC LocalDate参数的格式错误

  •  0
  • drenda  · 技术社区  · 7 年前

    我定制了一点REST配置:

    @Configuration
    public class RestConfig extends RepositoryRestConfigurerAdapter {
    
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return new Jackson2ObjectMapperBuilderCustomizer() {
    
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
    
                jacksonObjectMapperBuilder.serializers(InstantSerializer.INSTANCE);
                jacksonObjectMapperBuilder.serializers(new ZonedDateTimeSerializer(ISO_FIXED_FORMAT));
                jacksonObjectMapperBuilder
                        .serializers(new LocalDateSerializer(new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd").toFormatter()));
                jacksonObjectMapperBuilder.serializers(new LocalDateTimeSerializer(
                        new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").toFormatter()));
            }
    
        };
    }
    

    我在存储库中创建了一个自定义方法:

    @Transactional
    @PreAuthorize("isAuthenticated()")
    public interface DailyCodeRepository extends PagingAndSortingRepository<DailyCode, Long> {
    
    
        @Query("SELECT d FROM DailyCode d WHERE (:code IS NULL OR code=:code) AND (:from IS NULL OR date>=:from) AND (:to IS NULL OR date<=:to)")
        public Page<DailyCode> findAllWithParameter(@Param("code") @RequestParam(value = "code", required = false) String code,
                @Param("from") @RequestParam(value = "from", required = false) @DateTimeFormat(iso=ISO.DATE) LocalDate from,
                @Param("to") @RequestParam(value = "to", required = false) @DateTimeFormat(iso=ISO.DATE) LocalDate to, Pageable pageable);
    }
    

    这个 第一个问题 只有 如果我把注释 @DateTimeFormat(iso=ISO.DATE) ,否则它会选择我所在地区(意大利)的格式。我希望将其全局设置为响应的完成状态(请参阅我的Jackson2ObjectMapperBuilderCustomizer)。

    第二个问题 从客户端发送的日期参数被解释为1天前,因此请求如下:

    http://localhost:8080/api/v1/dailyCodes/search/findAllWithParameter?from=2017-07-07&to=2017-07-07
    

    导致对数据库进行此查询:

    select dailycode0_.`id` as id1_7_, dailycode0_.`created_by` as created_2_7_, dailycode0_.`created_date` as created_3_7_, dailycode0_.`last_modified_by` as last_mod4_7_, dailycode0_.`last_modified_date` as last_mod5_7_, dailycode0_.`sid` as sid6_7_, dailycode0_.`version` as version7_7_, dailycode0_.`code` as code8_7_, dailycode0_.`date` as date9_7_ from `daily_code` dailycode0_ where (null is null or dailycode0_.`code`=null) and ('2017-07-06' is null or dailycode0_.`date`>='2017-07-06') and ('2017-07-06' is null or dailycode0_.`date`<='2017-07-06') limit 20
    

    这是我的属性文件的相关部分:

    spring.mvc.date-format= `yyyy-MM-dd`
    # REST
    spring.data.rest.default-page-size= 20
    spring.data.rest.base-path=/api/v1
    spring.data.rest.enable-enum-translation=true
    
    #Jackson
    
    # to avoid an error loading lazy objects
    spring.jackson.serialization.fail-on-empty-beans=false
    spring.jackson.serialization.write-dates-as-timestamps=false
    spring.jackson.mapper.infer-property-mutators=false
    spring.jpa.properties.hibernate.jdbc.time_zone = UTC
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Abhijit Sarkar    7 年前

    您的代码中有几个问题:

    第一个问题是,该方法仅接受ISO格式

    OffsetDateTime (不是 ZonedDateTime 阅读 this this .

    为什么?你把这个日期解释成什么时区?您的本地时区可能与服务器的时区不同,而服务器的时区可能与客户端的时区不同。

    Jackson2ObjectMapperBuilderCustomizer

    这是用来做什么的?

    这应该没有必要,而且我不认为对Spring数据有任何作用。