Описание:
Параметр 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);
}
}
структура введите описание изображения здесь введите описание изображения здесь