Utknął z tym błędem na chwilę teraz.

EL1008E: Nie można znaleźć właściwości lub pola "ApplicationName" na obiekcie typu "java.lang.String" - może nie był publicznie lub nie jest ważny?

Próbuję uzyskać rekordy z bazy danych przez tymeleaf, ale zawsze otrzymuje ten błąd. Myślę, że zadeklarowałem wszystko, co jest potrzebne.

Oto mój kod

Model

@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;
    }
    
}

Kontroler

@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";
    }

Magazyn

@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);

Usługa

@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);
    }
    
}

Plik 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>
0
Mandy 15 październik 2020, 05:37

1 odpowiedź

Najlepsza odpowiedź

Metoda findSmsFlagByAppName w SmsRepository zwraca String. Twój kontroler umieszcza, że String w modelu za pomocą nazwy zmiennej sms. Następnie w widoku odwołujesz się ${sms.applicationName}, który próbuje ocenić właściwość applicationName na tym String, który oczywiście nie istnieje.

Możesz sprawić, że błąd odejdzie na wiele sposobów. Jedno jest, wypełnia model witka applicationName jako String, a następnie w widoku, a następnie w widoku odnieść się do tego String.

Inną opcją jest przerób metodę findSmsFlagByAppName, aby powrócić SmsAlert.

1
Jeff Scott Brown 15 październik 2020, 03:23