Spring boot 2: ConverterNotFoundException: не найден конвертер, способный преобразовать тип [java.time.ZonedDateTime] в тип [java.util.Date]. - PullRequest
0 голосов
/ 19 октября 2018

Я использую Spring-Boot 2.

Я тест Junit (@SpringBootTest), я использую org.springframework.test.web.servlet.MockMvc

@Test
@WithMockUser(roles = {"ADMIN"})
public void testGetSearchByFoodIdWithAdmin() throws Exception {
    final ResultActions resultActions = mockMvc.perform(get(RESOURCE_URL + "/search/findByFooId?fooId=123"))
                .andExpect(status().isOk());
}

У меня есть этот конвертер:

public class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {
    @Override
    public Date convert(final ZonedDateTime source) {
        return source == null ? null : Date.from(source.toInstant());
    }
}

У меня есть этот другой конвертер:

public class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {
    @Override
    public ZonedDateTime convert(final Date source) {
        return source == null ? null : ofInstant(source.toInstant(), systemDefault());
    }
}

У меня есть эта конфигурация Spring:

@Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeProvider")
public class MongoConfiguration {

    @Autowired
    MongoDbFactory mongoDbFactory;

    @Bean
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(new DateToZonedDateTimeConverter());
        converters.add(new ZonedDateTimeToDateConverter());
        return new MongoCustomConversions(converters);
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        MappingMongoConverter converter = getDefaultMongoConverter();
        //converter.afterPropertiesSet();
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
        return mongoTemplate;
    }

    @Bean
    public MappingMongoConverter getDefaultMongoConverter() throws Exception {
        MappingMongoConverter converter = new MappingMongoConverter(
                new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());
        converter.setCustomConversions(customConversions());
        return converter;
    }

}

У меня есть другая конфигурация Spring:

@Component
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateToZonedDateTimeConverter());
        registry.addConverter(new ZonedDateTimeToDateConverter());
    }

}

У меня есть эта ошибка:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.time.ZonedDateTime] to type [java.util.Date]

Почему у меня нет конвертераучитывается для части WebMvc, а для MongoDB это хорошо?

РЕДАКТИРОВАТЬ:

Я использую Spring Data Rest

@RepositoryRestResource(collectionResourceRel = "foo", path = "foo")
public interface FooRepository extends MongoRepository<Foo, String> {

    Foo findByFooId(@Param("fooId") String fooId);

}

My Foo класс:

@Document
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class Foo {

    @Id
    private String keyid;

    @NotNull
    private String fooId;

    @CreatedDate
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ZonedDateTime creationDate;

    @LastModifiedDate
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private ZonedDateTime updateDate;
}

РЕДАКТИРОВАТЬ № 2:

Я пробую это с CustomizedRestMvcConfiguration реализует RepositoryRestConfigurer`, но не единственная моя проблема:

@Configuration
@EnableWebMvc
public class CustomizedRestMvcConfiguration implements RepositoryRestConfigurer {

    @Bean
    public DateToZonedDateTimeConverter dateToZonedDateTimeConverter() {
        return new DateToZonedDateTimeConverter();
    }

    @Bean
    public ZonedDateTimeToDateConverter zonedDateTimeToDateConverter() {
        return new ZonedDateTimeToDateConverter();
    }

    @Override
    public void configureConversionService(ConfigurableConversionService conversionService) {
        conversionService.addConverter(dateToZonedDateTimeConverter());
        conversionService.addConverter(zonedDateTimeToDateConverter());
    }

}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Да, ответ sgrillon не работает, потому что проблема не в преобразовании Spring, а в преобразовании Jackson JSON MongoDB.

@ Аннотация к документу + ZonedDateTime - это проблема.Решение, как предложил sgrillion: «конвертер», но не Spring Converter / HandlerMapping.Вам необходимо добавить его в MongoTemplate.

Проверьте здесь для справки.Есть много всего - просто Google для: MongoDB ZonedDateTime.

ZonedDateTime с MongoDB

0 голосов
/ 19 октября 2018

MyWebMvcConfigurer extends WebMvcConfigurerAdapter , который с весны 5.0 устарел .Вместо этого вам следует реализовать интерфейс WebMvcConfigurer :

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // ...
    }
}

См. Документацию Преобразование типов для получения дополнительной информации.Также обратите внимание на различные аннотации!

...