EL1008E: свойство или поле ‘ApplicationName’ не могут быть найдены для объекта типа ‘java.lang.Строка’ — может быть, не является общедоступной или недопустимой?

#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. Спасибо за помощь