Deploy Spring Boot di Tomcat dan Berbagai Application Server Lain

Sebenernya spring boot sudah di embedd applicatoin server tomcat (hanya berisi web container, tidak bisa untuk java EE). Sehingga tidak perlu menggunakan application server lagi. Namun kadang orang karena sudah bayar application server lain, misal weblogic. dan ada beberapa aplikasi lain yang jalan di weblogic. Ingin mendeploy aplikasi spring boot di weblogic.

Secara tertulis harusnya tidak ada yang perlu dilakukan. Karena tujuan standarisasi J2EE adalah WAR/EAR bisa portable antar webserver. Namun kadang kenyataannya tidak, karena ada beberapa yang butuh fungsi spesifik app server, ataupun configurasi spesifik.

Sumber : Jrebel https://www.jrebel.com/calculate-your-roi-with-jrebel

Sebenernya application server yang mahal mahal itu bisa dijalankan di local laptop kita dan kita bisa melakukan auto reloading, hot swap, debugging juga. Namun, berat 😀

Catatan : Kita hanya bisa di deploy di tomcat jika aplikasi kita hanya menggunakan web container seperti spring boot. Jika kita memakai spring dan API J2EE selain web container, maka kita tidak bisa menggunakan tomcat.

Strategi

Menggunakan profile untuk mengethaui aplikasi ini jalan di app server mana. Untuk konfigurasi bisa dinamis tergantung profile di setting di pom.xml. Dan untuk fungsi yang spesifik ke App Server, bisa di bikin interface dan implementasi di tomcat hanya dummy saja. Dependency injection tergantung profile.

Pom.xml

	<profiles>
		<profile>
			<id>tomcat</id>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-war-plugin</artifactId>
						<configuration>
							<webXml>${basedir}/src/main/webapp/WEB-INF/web-tomcat.xml</webXml>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
	<dependencies>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

Application.properties

application.properties => default

application-tomcat.properties => jika menggunakna profile “tomcat”

Fungsi spesifik

@Component("weblogicAppServer")
@Profile("!tomcat")
public class WeblogicService implements AppServerSpecificFunctionInterface {
}
@Component("tomcatAppServer")
@Profile("tomcat")
public class TomcatService implements AppServerSpecificFunctionInterface {
}

Konfigurasi di intellij IDEA

Catatan Aspose Word

Aspose.word merupakan library untuk mengedit file microsoft office .docx. Sebenernya microsoft tidak mengeluarkan dokumentasi resmi API microsoft word. Dan file microsoft word dibuat sesuah mungkin untuk di edit (obfuscate). Makanya ada library open source bernama Apache POI (Poor Obfuscation Implementation) untuk mengedit file .docx (seperti Aspose.Word)

// TODO

Custom Numbering/Bullet

        com.aspose.words.List docList = doc.getLists().get(0);


        docList.getListLevels().get(2).setNumberStyle(NumberStyle.ARABIC);
        docList.getListLevels().get(2).setNumberFormat("\u0002)");

Spasi Numbering/Bullet

        if(paragraph.getListFormat().getListLevelNumber() == 0) {
            paragraph.getParagraphFormat().setFirstLineIndent(FIRST_LINE_INDENT_PT);
            paragraph.getParagraphFormat().setLeftIndent(LEFT_INDENT_PT);
        }

Header Tidak Jalan

Catatan Jasper Report

JasperReport adalah library reporting untuk membuat file docx, pdf, csv, xls. Berbeda dengan aspose/poi yang langsung berinteraksi dengan API microsoft office. Jasper menggunakan engine sendiri.

// TODO

HTML Tag

Jasper support html tag di textfield nya. Namun tidak semua tag di support. dan bold dan italic harus di ubah dulu tag nya.

    public static String convertHtmlTagToJasper(String text) {
        String newText = text;

        newText = newText.replace("<strong>", "<b>");
        newText = newText.replace("</strong>", "</b>");
        newText = newText.replace("<em>", "<i>");
        newText = newText.replace("</em>", "</i>");

        return newText;
    }

Print Tabel Menggunakan ArrayList (bukan datasource/database)

Menggunakan parameter dengan type ArrayList<String>

	<subDataset name="tableDataset">
		<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
		<parameter name="tableDatasetParam" class="java.util.ArrayList" nestedType="java.lang.String"/>
	</subDataset>

				<jr:table>
					<datasetRun subDataset="tableDataset">
						<datasetParameter name="tableDatasetParam">
							<datasetParameterExpression><![CDATA[$P{kepadaArray}]]></datasetParameterExpression>
						</datasetParameter>
						<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($P{tableArray}.size())]]></dataSourceExpression>
					</datasetRun>
					<jr:column>
						<property/>
						<jr:detailCell>
							<property/>
							<textField>
								<reportElement/>
								<textFieldExpression><![CDATA[$P{tableDatasetArray}.get($V{REPORT_COUNT} - 1)]]></textFieldExpression>

							</textField>
						</jr:detailCell>
					</jr:column>
				</jr:table>

Catchword

Mengedit Template

Service layer, Interface, perlu atau tidak?

Spring | Home
Sumber : https://spring.io/

Latar Belakang

(Contoh dalam kasus ini memakai Java framework spring). Namun bisa juga diteramkan di framework/bahasa lain. Umumnya pada spring terdapat beberapa layer berikut.

  1. controller/
  2. service/
  3. repository/

Namun pada beberapa kasus, terlihat overkill. Contohnya untuk fungsi CRUD data master. controller isinya satu baris saja mangil service, pas dicari declaration nya, eh ketemu interface service. Kita coba cari implementasi service nya, isinya satu baris saja manggil dao. Dan kemungkinan besar implementasi dari service dan dao nya akan hanya ada satu seumur hidup, gak akan bertambah.

Continue reading “Service layer, Interface, perlu atau tidak?”