J'essayais d'utiliser Spring Data JPA
sur Spring Boot
et j'ai continué à avoir des erreurs, je n'arrive pas à comprendre le problème:
Impossible de localiser l'attribut avec le nom donné [prénom] sur this ManagedType [com.example.h2demo.domain.Subscriber]
FirstName est déclaré dans ma classe d'entité. J'ai utilisé une classe de service avec DAO auparavant avec un projet différent et a parfaitement fonctionné.
Ma classe d'entité (les getters et les setters sont aussi dans la classe):
@Entity
public class Subscriber {
@Id @GeneratedValue
private long id;
private String FirstName,LastName,Email;
public Subscriber(long id, String firstName, String lastName, String email) {
this.id = id;
this.FirstName = firstName;
this.LastName = lastName;
this.Email = email;
}
}
...
Ma classe de référentiel
@Component
public interface SubscriberRepository extends JpaRepository<Subscriber,Long> {
Subscriber findByFirstName(String FirstName);
Subscriber deleteAllByFirstName(String FirstName);
}
Ma classe de service
@Service
public class SubscriberService {
@Autowired
private SubscriberRepository subscriberRepository;
public Subscriber findByFirstName(String name){
return subscriberRepository.findByFirstName(name);
}
public Subscriber deleteAllByFirstName(String name){
return subscriberRepository.deleteAllByFirstName(name);
}
public void addSubscriber(Subscriber student) {
subscriberRepository.save(student);
}
}
Et ma classe de contrôleur:
@RestController
@RequestMapping("/subscribers")
public class SubscriberController {
@Autowired
private SubscriberService subscriberService;
@GetMapping(value = "/{name}")
public Subscriber findByFirstName(@PathVariable("name") String fname){
return subscriberService.findByFirstName(fname);
}
@PostMapping( value = "/add")
public String insertStudent(@RequestBody final Subscriber subscriber){
subscriberService.addSubscriber(subscriber);
return "Done";
}
}
Essayez de changer private String FirstName,LastName,Email;
en private String firstName,lastName,email;
Ça devrait marcher.
findByFirstName
dans SubscriberRepository
essaie de trouver un champ firstName
par convention qui n'y est pas.
Selon spécification , les noms de propriété doivent commencer par une petite casse.
... L'algorithme de résolution commence par interpréter la totalité de la pièce (AddressZipCode) en tant que propriété et recherche dans la classe de domaine une propriété portant ce nom (non capitalisé) ....
Il essaiera de trouver une propriété avec un nom non capitalisé. Donc, utilisez firstName
au lieu de FristName
et etc ..
Après avoir modifié mes variables entity class
de lettre majuscule à lettre minuscule, par exemple, Username
à username
, la méthode Users findByUsername(String username);
fonctionne pour moi à présent.