#spring-boot #thymeleaf
#spring-boot #thymeleaf
Вопрос:
Застрял с этой ошибкой на некоторое время.
EL1008E: свойство или поле ‘ApplicationName’ не могут быть найдены для объекта типа ‘java.lang.Строка’ — может быть, не является общедоступной или недопустимой?
Я пытаюсь получить записи из базы данных через thymeleaf, но всегда выдает эту ошибку. Я думаю, что я объявил все, что нужно для этого.
Вот мой код
Модель
@Entity
@Table(name = "sms_alert", schema = "public")
public class SmsAlert {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sms_id")
private Long smsId;
@Column(name = "application_name")
private String applicationName;
@Column(name = "sms_flag")
private String smsFlag;
public SmsAlert() {
}
public SmsAlert(String applicationName, String smsFlag) {
super();
this.applicationName = applicationName;
this.smsFlag = smsFlag;
}
public Long getSmsId() {
return smsId;
}
public void setSmsId(Long smsId) {
this.smsId = smsId;
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public String getSmsFlag() {
return smsFlag;
}
public void setSmsFlag(String smsFlag) {
this.smsFlag = smsFlag;
}
}
Контроллер
@GetMapping(value = "/smsAlert/{applicationName}")
public String viewApplicationSmsAlert(@PathVariable("applicationName") String applicationName, Model model) {
System.out.println(applicationName);
model.addAttribute("sms", smsService.findSmsFlagByAppName(applicationName));
return "test";
}
Репозиторий
@Repository
public interface SmsRepository extends JpaRepository<SmsAlert, Long> {
@Query(value = "SELECT s.application_name, s.sms_flag FROM public.sms_alert s WHERE s.application_name= :applicationName ", nativeQuery = true)
public String findSmsFlagByAppName(@Param("applicationName") String applicationName);
Обслуживание
@Service
public class SmsService {
@Autowired
private SmsRepository smsRepository;
public List<SmsAlert> findAll() {
return smsRepository.findAll();
}
public String findSmsFlagByAppName(String applicationName) {
return smsRepository.findSmsFlagByAppName(applicationName);
}
public void updateSmsFlag(String applicationName, String smsFlag) {
smsRepository.updateSmsFlag(applicationName, smsFlag);
}
}
HTML-файл
<body>
<div id="content">
<div>
<table class="table table-hover table-striped" id="invTable">
<thead>
<tr class="table-primary">
<th id="terminalId">Terminal ID</th>
</tr>
</thead>
<tbody>
<tr th:each="sms : ${sms}">
<td th:text="${sms.applicationName}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
Ответ №1:
findSmsFlagByAppName
Метод в SmsRepository
возвращает a String
. Ваш контроллер помещает это String
в модель с именем переменной sms
. Тогда, по вашему мнению, вы ссылаетесь ${sms.applicationName}
на то, что пытается оценить applicationName
свойство для этого String
, которого, конечно, не существует.
Вы можете устранить ошибку несколькими способами. Во-первых, заполните модель applicationName
как a String
, а затем в представлении просто обратитесь к этому String
.
Другой вариант — переработать findSmsFlagByAppName
метод для возврата a SmsAlert
.
Комментарии:
1. Сработала опция, позволяющая методу findSmsFlagByAppName возвращать значение SmsAlert. Спасибо за помощь