EL1008E:在类型'java.lang.String'的对象上找不到属性或字段'applicationName'-可能不是公共的或无效的吗?

时间:2020-10-15 02:37:17

标签: spring-boot thymeleaf

现在这个错误困扰了一段时间。

EL1008E:在类型'java.lang.String'的对象上找不到属性或字段'applicationName'-可能不是公共的或无效的吗?

我试图通过百里香从数据库中获取记录,但总是会收到此错误。我想我已经声明了所有需要的东西。

这是我的代码

型号

@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 个答案:

答案 0 :(得分:1)

findSmsFlagByAppName中的SmsRepository方法返回一个String。您的控制器正在将String放入变量名称为sms的模型中。然后,在您看来,您引用的是${sms.applicationName},它正在尝试评估该applicationName上的String属性,该属性当然不存在。

您可以通过多种方法使错误消失。一种是,用applicationName作为String填充模型,然后在视图中简单地引用那个String

另一种选择是修改findSmsFlagByAppName方法以返回SmsAlert