JasperCompileManager.compileReport() ใน Request Loop เด็ดขาด เพื่อป้องกัน Metaspace OOM Crash จาก Dynamic ClassloadingJasperReportsContext ต้องเป็น Singleton Registry เพื่อแชร์ Configuration, Extensions และ Font Registry ส่วนกลาง.jasper คือแบบแปลนที่ถูกแคชบน Heap นำมาใช้ซ้ำข้ามเธรดได้อย่างปลอดภัย (Thread-safe)
pageHeight - margins)splitType="Prevent" (ห้ามผ่าแถวกลางคัน) และดัน Element ด้านล่างด้วย positionType="Float"
<element kind="..."> (เช่น kind="textField", kind="staticText") เลิกใช้แท็กโบราณเด็ดขาด$P{} รับค่าภายนอก), Fields ($F{} แมปจากเคอร์เซอร์ข้อมูล), Variables ($V{} สะสมยอดคำนวณ)evaluationTime="Now" (อ่านค่าทันที ณ แถวนั้น) เทียบกับ evaluationTime="Report" (ชะลอการวาดจนประมวลผลจบเล่ม)evaluationTime="Report" จะได้ค่าเริ่มต้น (0 หรือ null) เสมอ
| Sub-topic | องค์ประกอบหลัก (JRXML Elements) | จุดตายบน Production (Hazard) | ทางแก้เชิงสถาปัตยกรรม (Architecture Defense) |
|---|---|---|---|
| 1.1 Lifecycle | JasperCompileManager, JasperReport, JasperPrint |
Compile JRXML ทุก HTTP Request → Metaspace OOM Crash | Pre-compile เป็น .jasper หรือแคชแบบแปลน Singleton |
| 1.2 Bands | <band>, splitType, positionType="Float" |
ข้อความยาวดันขยาย → ตัวอักษรทับซ้อนหรือแถวถูกผ่ากลางตัวหนังสือ | ตั้ง positionType="Float" และกำหนด splitType="Prevent" |
| 1.3 Layout | <element kind="textField">, <box> |
พิกัด X/Width เหลื่อมกัน 1pt → คอลัมน์ Excel แตกและ Merge เละ | จัดแนวชิดเส้นกริด Snap-to-Grid และใช้ stretchType="ElementGroupHeight" |
| 1.4 Pipeline | $P{}, $F{}, $V{}, evaluationTime |
ยอด Grand Total แสดงเป็น 0.00 ในส่วนหัวเอกสาร | ตั้งค่า evaluationTime="Report" บน TextField เพื่อรอรอบสุดท้าย |
เขียน JRXML 7.0.x ให้ตรงตามเป้าหมายของแต่ละข้อ ภายใต้ Allowed/Disallowed Constraints:
ทดสอบความเข้าใจลึกระดับ JVM, Filler Engine, Band Lifecycle และ Evaluation State Machine (ข้อ 1 ถึง 35):