Spring Data Cassandra не может найти класс сущности - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь сохранить сущность Кассандры, но при запуске я получаю: Caused by: org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class com.service.model.Cart!

Это мой класс сущности:

package com.service.model;

import io.vavr.collection.LinkedHashMap;
import io.vavr.collection.Map;
import lombok.Getter;
import lombok.ToString;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Function;

@ToString
@Table("carts")
public class Cart {

  @Getter
  @PrimaryKey
  private final UUID uuid;
  private final Map<CartItemKey, CartItem> items;

  public Cart(UUID uuid) {
    this(uuid, LinkedHashMap.empty());
  }

  private Cart(UUID uuid, Map<CartItemKey, CartItem> items) {
    this.uuid = Objects.requireNonNull(uuid, "Cart's uuid cannot be null");
    this.items = Objects.requireNonNull(items, "Cart's items cannot be null");
  }
}

Это мой CassandraConfig:

package com.service.configuration;

import com.service.model.Cart;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.cassandra.config.AbstractClusterConfiguration;
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
import org.springframework.data.cassandra.core.cql.keyspace.CreateKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.KeyspaceOption;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static java.util.Collections.singletonList;

@Configuration
public class CassandraConfig extends AbstractClusterConfiguration {

  @Value("${spring.data.cassandra.keyspace-name}")
  private String keyspaceName;
  @Value("${spring.data.cassandra.contact-points}")
  private String contactPoints;

  @Override
  protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return singletonList(
        CreateKeyspaceSpecification.createKeyspace(keyspaceName)
        .ifNotExists()
        .with(KeyspaceOption.DURABLE_WRITES, true)
        .withSimpleReplication());
  }

  @Override
  protected boolean getMetricsEnabled() {
    return false;
  }

  @Override
  protected String getContactPoints() {
    return contactPoints;
  }

  @Bean
  public CassandraCustomConversions customConversions() {
    List<Converter<?, ?>> converters = new ArrayList<>();
    converters.add(new CartWriteConverter());
    converters.add(new CartReadConverter());
    return new CassandraCustomConversions(converters);
  }

  static class CartWriteConverter implements Converter<Cart, String> {
    public String convert(Cart source) {
      try {
        return new ObjectMapper().writeValueAsString(source);
      } catch (IOException e) {
        throw new IllegalStateException(e);
      }
    }
  }

  static class CartReadConverter implements Converter<String, Cart> {
    public Cart convert(String source) {
      if (StringUtils.hasText(source)) {
        try {
          return new ObjectMapper().readValue(source, Cart.class);
        } catch (IOException e) {
          throw new IllegalStateException(e);
        }
      }
      return null;
    }
  }
}

И, наконец, мое приложение:

package com.service.cart;

import org.axonframework.springboot.autoconfig.AxonServerAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;
import org.springframework.scheduling.annotation.EnableAsync;

@EnableCaching
@EnableAsync
@EnableFeignClients
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
    DataSourceAutoConfiguration.class,
    DataSourceTransactionManagerAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class,
    AxonServerAutoConfiguration.class})
@EnableCassandraRepositories(basePackages = "com.service.repository")
public class Application extends SpringBootServletInitializer {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

Что меня удивляет, так это то, что при удалении компонента customConversions() происходит сбой с другой ошибкой - невозможность отобразить vavr Map, поэтомувесна должна была отсканировать и зарегистрировать это лицо, чтобы оно было проверено.Это ожидается, хотя это не тип данных cassandra, но, насколько я понимаю, добавление пользовательских преобразований должно решить эту проблему.

Я также пытался поэкспериментировать с @EntityScan с теми же результатами.

Любая помощь будет признательна.

...