Поле SpringBoot @Entity не отображается без геттера
Выполнение базовой работы Spring MVC и JPA. У меня есть следующий класс POJO:
@Entity
public class Alien
{
@Id
private int aId;
private String aName;
// Standard getters and setters follow...
И контроллер отвечает на запрос
getAlien()
просто создав экземпляр этого класса и установив объект на странице:
@RequestMapping("/getAlien")
public ModelAndView getAlien(@RequestParam int aId)
{
System.out.println("In getAlien controller");
ModelAndView mv = new ModelAndView("showAlien.jsp"); // Can provide the view in constructor.
Alien alien = repo.findById(aId).orElse(new Alien());
mv.addObject(alien);
return mv;
}
showAlien.jsp
просто использует эти данные для печати:
Hello ${alien.aName}. Your ID is: ${alien.aId}.
Вот кое-что, что я заметил. Предположим, я хотел добавить
String
называется
favProgLang
как поле для моего
Alien
экземпляры:
public class Alien
{
@Id
private int aId;
private String aName;
private String favProgLang; // <--- The new field
// Standard getters and setters follow...
Я могу отрегулировать
showDisplay.jsp
чтобы использовать это поле:
Hello ${alien.aName}. Your ID is: ${alien.aId} and your favorite programming language is ${alien.favProgLang}.
Если я забуду добавить
public
получатель для
favProgLang
под моим
Alien
class, это возвращает код состояния 500, а в командной строке говорится:
javax.el.PropertyNotFoundException: The class 'com.jason.springbootjpa.model.Alien' does not have a readable property 'tech'.
Создание поля
public
и отпускание аксессора приводит к тому же поведению!
Как такое могло случиться? Разбор
.jsp
явно не использует никаких модификаторов доступа, он обращается к полям
alien
объект напрямую. Я не могу представить себе ситуацию, когда доступ к полю осуществляется напрямую через EL в
.jsp
file, а затем происходит исчерпывающий поиск получателей поля с таким именем. Кроме того, почему не сразу вышло из коробки, когда я сделал поле
public
, даже отпуская геттер? Конечно, должно быть удовлетворительное объяснение. Идеи?