Для параметра 5 конструктора в ... требуется bean-компонент типа '... Mapper', который не может быть найден - PullRequest
0 голосов
/ 06 августа 2020

Описание:

Параметр 5 конструктора в com.example.springmysqlelasti c .utils.ElasticSynchronizer требовал bean-компонента типа com.example.springmysqlelasti c .mapper.FoodMapper, который не мог

Действие:

Рассмотрите возможность определения bean-компонента типа com.example.springmysqlelasti c .mapper.FoodMapper в вашей конфигурации.

Существует модуль MySQL to Elasticsearch syn c, и все работает для объекта User. Затем я добавил новую сущность Food. Я установил файлы. Но теперь я получаю ошибку Bean в FoodMapper. Информация о проекте: еда, ресторан, поиск пользователей в движке Elasticsearch с помощью Spring.

FoodMapper. java

@Mapper(componentModel = "spring")
public interface FoodMapper {

    FoodDTO toFoodDTO(Food food);

    List<FoodDTO> toFoodDtos(List<Food> foods);

    Food toFood(FoodDTO foodDTO);

    List<Food> toFoods(List<FoodDTO> foodDTOS);

    FoodModel toFoodModel(Food food);
}

UserMapper. java

@Mapper(componentModel = "spring")
public interface UserMapper {

    UserDTO toUserDTO(User user);

    List<UserDTO> toUserDtos(List<User> users);

    User toUser(UserDTO userDTO);

    List<User> toUsers(List<UserDTO> userDTOS);

    UserModel toUserModel(User user);
}

FoodService. java

@Service
public class FoodService implements IFoodService {

    private IFoodDAO foodDAO;
    private FoodMapper foodMapper;

    @Autowired
    public FoodService(IFoodDAO foodDAO, FoodMapper foodMapper) {
        this.foodDAO = foodDAO;
        this.foodMapper = foodMapper;
    }

    @Override
    public FoodDTO save(FoodDTO foodDTO) {
        Food food = this.foodDAO.save(this.foodMapper.toFood(foodDTO));
        return this.foodMapper.toFoodDTO(food);
    }

    @Override
    public FoodDTO findById(Long id) {
        return this.foodMapper.toFoodDTO(this.foodDAO.findById(id).orElse(null));
    }

    @Override
    public List<FoodDTO> findAll() {
        return this.foodMapper.toFoodDtos(this.foodDAO.findAll());
    }


}

ElasticSynchorizer. java

@Service
public class ElasticSynchronizer {

    private IUserDAO userDAO;
    private IUserESRepo userESRepo;
    private UserMapper userMapper;
    private IFoodDAO foodDAO;
    private IFoodESRepo foodESRepo;
    private FoodMapper foodMapper;

    private static final Logger LOG = LoggerFactory.getLogger(ElasticSynchronizer.class);

    @Autowired
    public ElasticSynchronizer(IUserDAO userDAO, IUserESRepo userESRepo, UserMapper userMapper, IFoodDAO foodDAO, IFoodESRepo foodESRepo, FoodMapper foodMapper) {
        this.userDAO = userDAO;
        this.userESRepo = userESRepo;
        this.userMapper = userMapper;
        this.foodDAO = foodDAO;
        this.foodESRepo = foodESRepo;
        this.foodMapper = foodMapper;
    }

    @Scheduled(cron = "0 */3 * * * *")
    @Transactional
    public void sync() {
        LOG.info("Start Syncing Users - {}", LocalDateTime.now());
        this.syncUsers();
        LOG.info(" End Syncing Users - {}", LocalDateTime.now());
        LOG.info("Start Syncing Foods- {}", LocalDateTime.now());
        this.syncFoods();
        LOG.info(" End Syncing Foods - {}", LocalDateTime.now());
    }

    private void syncUsers() {

        Specification<User> userSpecification = (root, criteriaQuery, criteriaBuilder) ->
                getModificationDatePredicate(criteriaBuilder, root);
        List<User> userList;
        if (userESRepo.count() == 0) {
            userList = userDAO.findAll();
        } else {
            userList = userDAO.findAll(userSpecification);
        }
        for(User user: userList) {
            LOG.info("Syncing User - {}", user.getId());
            userESRepo.save(this.userMapper.toUserModel(user));
        }
    }
    private void syncFoods() {

        Specification<Food> userSpecification = (root, criteriaQuery, criteriaBuilder) ->
                getModificationDatePredicate(criteriaBuilder, root);
        List<Food> foodList;
        if (userESRepo.count() == 0) {
            foodList = foodDAO.findAll();
        } else {
            foodList = foodDAO.findAll(userSpecification);
        }
        for(Food food: foodList) {
            LOG.info("Syncing Food - {}", food.getId());
            foodESRepo.save(this.foodMapper.toFoodModel(food));
        }
    }
    private static Predicate getModificationDatePredicate(CriteriaBuilder cb, Root<?> root) {
        Expression<Timestamp> currentTime;
        currentTime = cb.currentTimestamp();
        Expression<Timestamp> currentTimeMinus = cb.literal(new Timestamp(System.currentTimeMillis() -
                (Constants.INTERVAL_IN_MILLISECONDE)));
        return cb.between(root.<Date>get(Constants.MODIFICATION_DATE),
                currentTimeMinus,
                currentTime
        );
    }
}

Food. java

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private float price;
    private String category;
    private String description;
    private String imglink;
    private String restaurant;
    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp
    private Date modificationDate;

    
}

Foodmodel. java

@NoArgsConstructor
@AllArgsConstructor
@Data
@Document(indexName = "food") //type deprecate oldu hepsi artik _doc
public class FoodModel {
    private Long id;
    private String name;
    private float price;
    private String category;
    private String description;
    private String imglink;
    private String restaurant;
    private Date modificationDate;
}

FoodDTO. java

@NoArgsConstructor
@AllArgsConstructor
@Data
public class FoodDTO {
    private Long id;
    private String name;
    private float price;
    private String category;
    private String description;
    private String imglink;
    private String restaurant;
}

IFoodDAO. java

@Repository
public interface IFoodDAO extends JpaRepository<Food, Long>, JpaSpecificationExecutor<Food> {
    //List<User> findByNameContaining(String name);
}

IFoodESRepo. java

public interface IFoodESRepo extends ElasticsearchRepository<FoodModel, Long> {
      //List<Food> findByNameContaining(String name);

}

основной класс

@SpringBootApplication
@EnableElasticsearchRepositories("com.example.springmysqlelastic.repo.elastic")
@EnableScheduling
@EnableJpaRepositories("com.example.springmysqlelastic.repo")
//@ComponentScan(basePackages = {"com.example.springmysqlelastic"})
//@EnableAutoConfiguration

public class SpringMysqlElasticApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringMysqlElasticApplication.class, args);
    }

}

структура введите описание изображения здесь введите описание изображения здесь

1 Ответ

0 голосов
/ 06 августа 2020

Я обнаружил, что не могу использовать несколько картографов. Второй маппер перемещен в первый, теперь работает. Не используйте более 1 маппера.

...