У меня проблема с моим CountryServiceImpl, когда я хочу реализовать метод findOne в CountryServiceImpl, он сообщает мне: «Предполагаемый тип 'S' для параметра типа 'S' выходит за пределы его границ; должен расширять 'ua.com.store.entity.Country" .
Сам хотел исправить, но не понимаю, что это значит. Не могли бы вы помочь мне с этой проблемой.
Спасибо.
@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String countryName;
@OneToMany(mappedBy = "country")
private Set<Brand> brands = new HashSet<Brand>();
}
public interface CountryDAO extends JpaRepository<Country, Integer> {
@Query("from Country c where c.countryName=:name")
Country findByCountryName(@Param("name") String name);
}
public interface CountryService {
void save(Country country);
void delete(Country country);
List<Country> findAll();
Country findOne(int id);
Country findByCountryName(String name);
}
@Service
public class CountryServiceImpl implements CountryService {
@Autowired
private CountryDAO dao;
@Override
public void save(Country country) {
dao.save(country);
}
@Override
public void delete(Country country) {
dao.delete(country);
}
@Override
public List<Country> findAll() {
return dao.findAll();
}
@Override
public Country findOne(int id) {
return dao.findOne(id);
}
@Override
public Country findByCountryName(String name) {
return dao.findByCountryName(name);
}
}




Документация Spring определяет методы getOne следующим образом
<S extends T> Optional<S> findOne(Example<S> example)
В вашем методе вашим входным параметром является id типа int, но он не привязан к интерфейсу Example.
Чтобы найти объект с его идентификатором, вы можете использовать метод
Optional<T> findById(ID id)
В соответствии с вашей реализацией вы можете написать это
@Override
public Country findOne(int id) {
return dao.findById(id);
}
Можно быть актуальным о версии с весенней загрузкой. Я сталкиваюсь с той же проблемой, когда моя версия весенней загрузки - 2.0.1.RELEASE. Но после изменения версии с весенней загрузкой на 1.5.9.RELEASE проблема решена.
Он существует в jar lib с именем spring-data-commons. Spring-data-commons jar lib зависит от библиотеки spring-boot-starter-data-jpa. Когда мои зависимости - org.springframework.boot:spring-boot-starter-data-jpa:1.5.9.RELEASE, код class org.springframework.data.repository.CrudRepositorypublic interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID>
Когда у меня зависимости org.springframework.boot:spring-boot-starter-data-jpa:2.0.1.RELEASE, код org.springframework.data.repository.query.QueryByExampleExecutorpublic interface QueryByExampleExecutor<T> А в версии 2.0.1.RELEASE нет файла интерфейса CrudRepository. кстати, есть один сэмпл по адресу github.com/spring-guides/tut-rest/issues/53.
Спасибо за ответы, пожалуйста, отредактируйте их в своем ответе, чтобы они могли помочь будущим посетителям. :)
100% рабочее решение следующее:
@Override
public Country findOne(int id) {
return dao..findById(id).orElse(null);
}
Вам нужно изменить из
public T getOne(ID id) {
return repository.getOne(id);
}
К
public Optional<T> getOne(ID id) {
return repository.findById(id);
}
getOne - это метод JpaRepository, а findById - метод CrudRepository, я думаю, вы теперь поймете
Я просто решил эту проблему в своей программе. Я не использую метод findOne, я просто сохранял исходные данные методом save. Оказывается, я скопировал свой интерфейс репо из другого интерфейса репо и забыл обновить объект в «расширяет JpaRepository <Object, Long>» на новый объект.
Благодарю. без вашего ответа я могу не думать об этом.
Это сработало для меня ...
@Override
public Country findOne(int id) {
return dao.findById(id).orElse(null);
}
У вас есть доказательства, подтверждающие это?