Ralat & Penyelesaian Pasukan Lucee MY

Ralat pelayan, Java dan editor: bila kod betul tetapi Lucee degil

Ralat yang bukan salah kod: kelas Java tidak dimuat, kod lama masih berjalan, gaya sebaris dibuang CSP, null dalam Java dan kod QR yang gagal diimbas.

0
Kandungan

Ralat pelayan, Java dan editor: bila kod betul tetapi Lucee degil

Ada kelas ralat yang tidak menyalahkan kod anda. Fail sudah betul, sintaks sudah lulus, tetapi hasilnya tetap salah. Lima kes di bawah ini berlaku pada lapisan antara kod dan enjin, dan itulah sebabnya ia mengambil masa paling lama untuk dikesan.

Kenapa kelas Java tidak dijumpai walaupun JAR sudah ada?

Mesej:

cannot load class through its string name, because no definition for the class
with the specified name [com.google.zxing.EncodeHintType] could be found

JAR itu ada dalam WEB-INF/lib, tetapi Lucee tidak memuatkannya. Meletakkan fail di situ sahaja tidak mencukupi.

Pembetulan: beritahu Lucee di mana hendak mencari kelas, dalam Application.cfc.

this.javaSettings = {
    loadPaths: [ this.root & "WEB-INF/lib" ],
    loadColdFusionClassPath: true
};

Selepas menambah tetapan itu, aplikasi mesti dimulakan semula kerana kelas dimuatkan semasa app start.

Amalan yang baik untuk alat yang bergantung pada pustaka luar: simpan JAR bersama kod, jangan pasang ke dalam imej enjin. Dengan cara itu, alat itu dibawa bersama aplikasi dan tidak hilang apabila enjin dinaik taraf.

Kenapa kod lama masih berjalan selepas saya sunting fail?

Gejala: fail di cakera sudah berubah, tetapi halaman masih menunjukkan tingkah laku lama. Kadang-kadang mesej ralat menunjuk baris yang sudah tiada dalam fail.

Sebabnya bergantung pada jenis fail.

Templat .cfm biasanya disusun semula pada permintaan berikutnya, jadi suntingan berkuat kuasa serta-merta. Tetapi komponen yang dibina semasa app start, termasuk Application.cfc, setiap perkhidmatan dalam app/services/, setiap pengendali dalam app/handlers/, dan komponen dalam app/core/, kekal dalam memori sehingga enjin dimulakan semula.

Menghapuskan folder kelas tersusun tidak mencukupi kerana Lucee menyimpan kelas itu dalam kumpulan halaman dalam memori.

Pembetulan: mulakan semula bekas.

docker restart <nama-bekas>

Kemudian sahkan pada respons hidup, bukan pada fail.

curl -s https://lucee.my/sitemap.xml | grep -c '/slug-baharu'

Peraturan praktikal: kalau suntingan anda menyentuh Application.cfc, services/, handlers/ atau core/, jangkakan mula semula. Kalau ia menyentuh views/, assets/ atau i18n/, biasanya tidak perlu.

Kenapa gaya CSS saya tidak dipakai walaupun ia ada dalam HTML?

Gejala: halaman berfungsi, tetapi kelihatan seperti HTML tanpa reka bentuk. Tiada ralat dalam konsol, dan CSS memang ada dalam fail.

Puncanya pengepala keselamatan. Aplikasi menetapkan:

Content-Security-Policy: style-src 'self'

Dengan tetapan itu, pelayar membuang setiap blok <style> dan setiap atribut style="..." yang ditulis dalam halaman. Ia hanya menerima fail CSS dari domain yang sama.

Pembetulan: pindahkan gaya ke fail CSS yang dihidangkan.

/assets/css/app.css

Tulis peraturan dengan skop yang jelas supaya ia tidak menjejaskan halaman lain.

<style>
/* jangan letak ini dalam pandangan: CSP akan membuangnya */
</style>

Contoh di atas ialah corak yang salah dan sengaja ditulis sebagai rujukan. Yang betul ialah menambah peraturan ke app.css, menaikkan versi aset supaya pelayar memuat semula, kemudian mengesahkan dengan getComputedStyle dalam pelayar.

Kenapa panggilan Java gagal dengan variable [NULL] doesn't exist?

Mesej:

variable [NULL] doesn't exist

null ialah kata kunci dalam CFML, jadi ia tidak boleh dihantar sebagai nilai biasa kepada method Java yang menerima objek pilihan.

g.drawImage(logo, x, y, saiz, saiz, warna, null);

Pembetulan: hantar null Java melalui javacast.

<cfset g.drawImage(logo, x, y, saiz, saiz,
    createObject("java", "java.awt.Color").WHITE, javacast("null", ""))>

Perkara yang sama berlaku pada mana-mana argumen yang dokumen Java tandakan sebagai "boleh null", termasuk ImageObserver, Comparator dan FileFilter.

Kenapa kod QR saya kelihatan sempurna tetapi gagal disahkan?

Gejala: kod dijana, zbar membacanya dengan betul, tetapi fungsi pengesahan dalaman membalas gagal.

Puncanya pilihan pembaca, bukan kod QR itu. Pembaca biasa mengesan bucu dan membetulkan perspektif, dan untuk imej yang kita jana sendiri ia kadang-kadang gagal pada muatan berbilang baris.

pembaca.decode(bitmap) -> NotFoundException

Pembetulan: beritahu pembaca bahawa imej itu kod tulen, tanpa herotan kamera.

<cfset petunjuk = createObject("java", "java.util.EnumMap").init(
    createObject("java", "com.google.zxing.DecodeHintType").getClass())>
<cfset petunjuk.put(createObject("java", "com.google.zxing.DecodeHintType").PURE_BARCODE,
    javacast("boolean", true))>
<cfset hasil = createObject("java", "com.google.zxing.MultiFormatReader")
    .init().decode(bitmap, petunjuk)>

Selepas perubahan itu, muatan vCard dan acara yang sebelum ini gagal disahkan lulus. Amalan yang baik: bandingkan juga teks selepas membuang chr(13), kerana baris baharu boleh berbeza antara platform.

Contoh penuh alat yang memakai corak ini ialah penjana QR komuniti di laman ini.

Corak di sebalik lima ralat ini

Semua lima berlaku di luar kod aplikasi: pemuat kelas, kumpulan halaman, pengepala keselamatan, jambatan Java, dan pilihan pembaca.

Kerana itu, apabila kod kelihatan betul, jangan baca kod itu lagi. Tanya soalan yang berbeza: adakah enjin memuatkan apa yang saya sangka? Adakah pelayar menerima apa yang saya hantar? Adakah pustaka yang saya panggil berkelakuan seperti yang saya jangka?

Satu tabiat membantu: ubah satu lapisan pada satu masa. Mula semula bekas tanpa mengubah kod, dan lihat sama ada gejala berubah. Kalau ia berubah, masalahnya pada pemuatan, bukan pada logik. Kalau ia tidak berubah, tukar satu tetapan, bukan lima. Setiap perubahan yang dibuat serentak menghilangkan maklumat, dan itulah sebabnya kerja penyahpepijatan kadang-kadang mengambil masa lebih lama daripada menulis kod itu sendiri.

Ralat yang datang daripada kod sendiri memberi mesej yang menunjuk fail dan baris, dan ia lebih mudah dikesan kerana punca dan gejalanya berada di tempat yang sama.

Cara memisahkan masalah kod daripada masalah pelayan

Apabila satu blok kod berjaya pada satu halaman dan gagal pada halaman lain, jangan ubah kod itu dahulu. Bawa blok yang sama ke bekas Lucee bersih dengan versi enjin yang sama, kemudian jalankan.

Kalau ia berjaya di sana, tetapan pelayan yang berbeza. Tiga perkara yang paling kerap berbeza: javaSettings yang tidak ada, nullSupport yang berbeza, dan pengepala keselamatan yang lebih ketat.

Kalau ia gagal di sana juga, kod itu memang salah, dan rig bersih memberi mesej yang lebih jujur kerana tiada tetapan tempatan yang menutupinya.

Untuk perubahan yang tidak muncul langsung, bandingkan cap masa fail dengan masa mula enjin.

stat -c '%y' WEB-INF/app/handlers/alat.cfc
docker inspect -f '{{.State.StartedAt}}' <nama-bekas>

Kalau fail lebih baharu daripada masa mula, enjin belum memuatkannya. Itu bukan pepijat kod.

GejalaLapisanTindakan
Kelas Java tidak dijumpaipemuat kelastambah javaSettings, mula semula
Kod lama masih berjalankumpulan halamanmula semula bekas
Gaya hilang tanpa ralatCSP di pelayarpindah ke fail CSS
variable [NULL]jambatan Javajavacast("null","")
Pengesahan QR gagalpilihan pembacaPURE_BARCODE

Jadual itu berguna sebagai senarai semak, tetapi jangan gunakannya sebagai diagnosis. Dua gejala boleh datang daripada lapisan yang berbeza: gaya yang hilang boleh bermakna CSP membuangnya, atau fail CSS tidak dihidangkan langsung, dan kedua-duanya kelihatan sama pada skrin. Sebab itu langkah pertama sentiasa memeriksa respons mentah, bukan rupa halaman.

Soalan Lazim

Adakah this.javaSettings memperlahankan permulaan? Sedikit, kerana setiap JAR dipindai sekali. Ia tidak menjejaskan permintaan biasa.

Boleh saya mula semula hanya satu aplikasi tanpa mula semula bekas? Dalam kebanyakan tetapan Lucee, ya, tetapi hasilnya tidak konsisten antara versi. Untuk perubahan yang menyentuh app start, mula semula bekas ialah cara yang boleh dipercayai.

Kenapa CSP tidak menjejaskan dev tetapi menjejaskan prod? Kerana pengepala itu ditetapkan oleh aplikasi, dan tetapan keselamatan biasanya lebih ketat pada hos produksi.

Adakah PURE_BARCODE berfungsi untuk imej yang diimbas dengan kamera? Tidak. Ia untuk imej yang dijana komputer. Untuk foto kamera, gunakan pembaca biasa dengan TRY_HARDER.

Bagaimana saya tahu sama ada masalahnya pada kod atau pada pelayan? Uji blok yang sama dalam bekas Lucee bersih dengan versi yang sama. Kalau ia berjaya di sana, masalahnya pada tetapan pelayan, bukan pada kod.

Sumber

0 komen

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk