วันศุกร์ที่ 11 มกราคม พ.ศ. 2551

วิธีการแก้ไขปัญหาเมื่อเราไม่เจอ JNDI Name On RAD 6.0

เป็นวิธีการดูเป็น Step น่ะครับ ว่าควรจะตรวจสอบอะไรบ้าง ถ้ามันมีปัญหา Exception JNDI Name Not found. น่ะครับ โดย ทำดังนี้

1. ต้องตรวจสอบก่อนว่าอันไหนไปเรียก JNDI Name ตัวนั้น (Web Project, EJB Project, Project Client)
  • วิธีการตรวจสอบนั้นให้ตรวจสอบจาก SystemOut.log ดูที่เป็น Error จาก Package ของเราแล้วดูลงไปเรื่อยๆ ก็จะรู้ว่ามาจากตัวไหน
2. หลังจากนั้นก็ไปดูที่ Reference ของตัวที่เรียกว่ามีการสร้างไว้หรือยัง โดย

  • ถ้าไปเรียก EJB จะมี Config สองส่วน (อยู่ใน XML File ที่ Tab Reference)ดังรูป



    • จากรูป Name ข้างบนจะเป็น JNDI Name ที่เราใช้เรียกใน Project นั้นครับ ตรวจสอบดูว่าเขียนชื่อถูกหรือเปล่า
    • อันล่างตรง WebSphere Binding ตรงนี้คือ JNDI Name ที่ไปเรียกที่ Websphere ชื่ออะไร คือ JNDI Name ที่อยู่ใน EJB Project นั่นล่ะครับ (โดยปกติเราจะไม่ต้อง Config อันนี้จะดึงค่าจาก JNDI Name ใน EJB Project ให้เลยน่ะครับ ยกเว้นกรณีที่เรามีการแก้ไข JNDI Name ที่ EJB Project มันจะไม่ Auto แก้ให้ต้องมาแก้ไขเองน่ะครับ)

  • ถ้าไปเรียกอย่างอื่น เช่น Datasource ก็มี Config สองส่วนเหมือนกัน ดังรูป


    • ส่วนบนก็ชื่อที่เราใช้เรียกใน Project ของเรา
    • อันล่างตรง WEbsphere Binding ตรงนี้เป็นที่เราไปเรียก JNDI Name ที่ Server ครับ (อันนี้เราต้องเขียนค่าลงไปเองครับ ไม่มี Default ค่าให้)

3. หลังจากตรวจดูจากข้อสอง เสร็จแล้ว
  • ถ้าเป็น Web Project ให้ Save แล้ว Restart Application ถึงจะใช้งานได้ครับ
  • ถ้าเป็น EJB Project ให้ Deploy EJB แล้วก็จะใช้งานได้ครับ
4. หลังจากทำเสร็จแล้วควรจะไม่มีปัญหา JNDI Name Not Found แล้วนะครับ


หมายเหตุ
  • สำหรับ EJB ไปเรียก EJB ด้วยกัน ใน EJB Project เดียวกันก็ต้อง Config Reference เหมือนกันนะครับ ถึงจะเห็น
  • ทุกครั้งที่ Config พวกนี้ ถ้าเป็น EJB ต้อง Deploy ใหม่ทุกครับ สำหรับ Web Project ตั้อง Restart Application ทุกครั้ง

วันพุธที่ 9 มกราคม พ.ศ. 2551

Step By Step Create Entity Bean By Rad 6.0

1. Create EJB Project ขึ้นมาก่อน
2. สร้าง Map-Relationship โดยคลิกขวาที่ EJB Project เลือก EJB to RDB Mapping จะขึ้นหน้าต่างดังรูป


3. ทำการเลือก Create a new backend folder (กรณีที่ยังไม่ได้ทำไว้น่ะครับ ถ้าทำไว้แล้วจะมีอยู่แล้ว) แล้ว กด Next
4. เลือก Bottom-Up (ถ้าสร้างครั้งแรกก็มีให้เลือกอยู่อันเดียวอยู่แล้วครับ) แล้วกด Next
5. จะขึ้นหน้าต่างดังภาพ (ซึ่งจะเป็นการ Config DB ครับ ข้างล่างผม Config ให้ใช้กับ Oracle น่ะครับ)


6. หลังจากกด Next แล้ว จะให้เราเลือกว่าจะเอา Table ไหนบ้าง ก็เลือกที่เราต้องการได้เลยครับ แล้วกด Finish ได้เลย
7. เสร็จแล้วก็ คลิกขวา Deploy EJB ก็จะใช้งานได้แล้วครับ
8. วิธีเรียกก็เหมือนเรียก EJB ปกติครับ

หมายเหตุ
1. บางทีเราอาจจะต้อง add JNDI - CMP Connection Factory Binding ครับ คือ เป็นการ Add Adtasource Reference เข้ากับที่ Server Config ไว้น่ะครับ (สร้างเป็น XA Datasource)
2. ถ้าเราอยากเพิ่มให้ Add เป็น Model ได้ให้เพิ่ม create ที่รับเป็น Model ได้เลยครับ โดย
  1. เพิ่มที่ xxxLocalHome รับ Model ที่ต้องการ
  2. เพิ่มที่ xxxBean โดยต้องเพิ่มสองเมธอด คือ ejbCreate, ejbPostCreate
  3. เพิ่มการ set ค่าลงไปใน ejbCreate แต่ใน ejbPostCreate ไม่ต้องทำอะไรครับ

EJB Life Cycle

จดไว้เตือนความจำครับ

1. Statefull Session Bean
  1. เมื่อไม่มี --> create --> SetSessionContext --> ready --> ejbRemove --> Remove
  2. เมื่อไม่ได้ใช้งานนานๆ --> ejbPassivate จะใช้ก็ --> ejbActivate
2. Stateless Session Bean
  1. ทุกครั้งจะ create --> SetSessionContext --> ejbRemove --> Remove
3. Entity Bean
  1. ทำการ Set EntityContext --> ลง Pool --> create --> ejbCreate --> ejbPostCreate --> ready
  2. ถ้าไม่ได้ใช้เก็บลง Pool โดย ejbPassivate ถ้าจะใช้ก็ ejbActivate
  3. เมื่อยกเลิกจะไป remove --> ejbRemove --> ลง Pool --> unsetEntityContext
4. Message Driven Bean
  1. เมื่อไม่มี setMessageDrivenContext --> ready (onMessage) --> ejbRemove
อันนี้คร่าวๆ ที่จริมีละเอียดกว่านี้ ต้องอ่านตาม Reference เอาครับ อันนี้ผมจดไว้จะเขียน Process เพื่อ Handle อ่ะครับ


Reference
- http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts9.html
- http://www.leocrawford.org.uk/work/jcea/part1/ejbcontainer.html

วันอังคารที่ 8 มกราคม พ.ศ. 2551

Config Hibernate ให้ใช้บน RAD 6.0 + Oracle แบบ EJB

วิธีนี้จะดีกว่าวิธีที่กลาวมก่อนแล้ว เพราะให้ EJB ควบคุม Transaction นะครับ เราไม่จำเป็นต้องเปิด ปิด มัน มันจะ ปิดให้เองโดย EJB ครับ ทำได้ดังนี้

1. ต้องเปลี่ยนเป็นใช้ .getCurrentSession() แทน openSession() ครับ ตอนเราเรียก Session มาใช้งาน
2. แก้ hibernate.cfg.xml เพื่อบอกมันว่าจะใช้ Transaction ซึ่งแต่ละ Server จะเรียกคนละชื่อกันครับ ต้องดูเอา (ผมเคยลอง Test MySQL กับ Websphere 6.0 แล้ว ใช้งานไม่ได้ครับ)

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</property>

อันนี้เป็นของ Websphere Server 6.x นะครับ ถึงจะใช้งานได้

3. แล้วเราก็จะใช้งานได้แล้ว

หมายเหตุ
1. วิธีแบบนี้มีข้อเสียคือ ต้องทำผ่าน EJB เสมอไม่ว่าจะเป็น การ Select ค่าก็ตาม
2. ต้องพยายามทำบน EJB ตัวเดียวกัน เพราะ ถ้าทำคนละตัวอาจจะมีการเรียก Insert, Update ผิดพลาดได้

Config Hibernate ให้ใช้บน RAD 6.0 + Oracle แบบธรรมดา

อันนี้เป็นแบบธรรมดา ไม่ได้ใช้ Transaction ของ Websphere ในการควบคุม (แบบนี้สามารถไปใช้ บนEclipse ได้ด้วย และ Server ไหนก็ได้ครับ) และผมใช้ Datasource ด้วย
1. สร้าง Project ขึ้นมาก่อน (Web Project + Ear Project)
2. โหลด Hibernate ที่นี่ (ที่ผมใช้เป็น Hibernate 3.2 ครับ)
3. Copy Library มาใส่ที่ Project ของเรา หรือจะทำการ Add Share Library ใน Ear Project ก็ได้
4. ทำการ สร้าง HibernateUtil ขึ้นมาเพื่อเรียกใช้งาน (โดย Copy File จาก Tutorial มาใช้ได้เลยครับ)

private static final SessionFactory sessionFactory;

static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure("WEB-INF/hibernate.cfg.xml").buildSessionFactory(); //อันนี้ผมอ้างที่อยู่ของ File Config ว่าอยู่ที่ไหน
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;// ที่เราจะเอาไปใช้งาน
}

5. ต่อไปก็สร้าง hibernate.cfg.xml ซึ่งไว้สำหรับ Config ของ Hibernate

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- Database connection settings -->

<property name="hibernate.connection.datasource">jdbc/spag</property> //Config Datasource ที่เราใช้งาน

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>

<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> //เลือกเป็น Oracle 9i

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<mapping resource="com/test/hibernate/model/GeneralParamM.hbm.xml"/> //Config Table ที่เราใช้งาน

</session-factory>

</hibernate-configuration>

6. ต่อไปเราสร้าง Config ของ Table โดยผมจะสร้างไว้ที่ com.test.hibernate.model ครับชื่อ ไฟล์ GeneralParamM.hbm.xml ซึ่งพวกนี้ผม Config ไว้ใน hibernate.cfg.xml ตามบรรทัดข้างล่างสุด


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>


<class name="com.test.hibernate.model.GeneralParamM" table="GENERAL_PARAM"> //บอกว่าใช้ Class ไหน Mapping กับ Table ไหน
<id name="paramCode" column="PARAM_CODE"> //บอกว่าเป็น Primary Key
<generator class="assigned"/>//บอกว่าใช้แบบ Assign ค่าลงไปเอง
</id>
<property name="paramValue" column="PARAM_VALUE"/>
<property name="labelName" column="LABEL_NAME"/>
<property name="editableFlag" column="EDITABLE_FLAG"/>
</class>


</hibernate-mapping>

7. พอสร้างทั้งหมดเสร็จแล้ว เราก็มาลองเรียกมันดูโดย


SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session sessionHibernate = sessionFactory.openSession(); //เปิด Session ไว้ใช้งาน
Criteria criteria = sessionHibernate.createCriteria(GeneralParamM.class);
criteria.add(Restrictions.eq("paramCode",)); //ใส่ค่าที่เราต้องการหา

List result = criteria.list();

sessionFactory.close(); //ปิด Session จำเป็นต้องปิทุกครั้งนะครับ

8. พอสั่งรันเสร็จ มันก็จะดึงค่าจาก Table ขึ้นมาให้ครับ (ตรวจสอบ SystemOut.log ด้วยว่า Error หรือเปล่า) อันนี้เป็ฯแบบง่ายๆ นะครับ

หมายเหต
1. อาจจะมีปัญหาพอดึงค่าแล้วสั่งปิด ไปค่าที่ได้ไม่มาเกิด Exception นะครับ
2. ถ้าใช้วิธีนี้จะต้องปิดทุกครั้งที่เลิกใช้งาน ไม่งั้น Session จะค้าง

วันจันทร์ที่ 7 มกราคม พ.ศ. 2551

การเรียก Web Service ผ่าน Java ที่เราทำการ Generate แล้ว

วีธีในการเรียกนั้ เราสามารถที่จะเรียกผ่าน Proxy หรือ Locator ก็ได้ครับ ทำไ้ดัดังนี้

1. วิธีการเรียกผ่าน Proxy ทำดังนี้

xxxProxy proxy = xxxProxy();
proxy.setEndpoint(endpoint); //ไว้สำหรับ Set URL ของ Web Service ที่เราจะไปเรียก
proxy.process(); //เรียก Process ที่เราต้องการใช้ใน Web Service นั้น


2. เรียกผ่าน Locator ดังนี้

xxxLocator locator = new xxxLocator(); //เรียก Service Locator
xxx service = locator.getxxx(new URL("endpoint")); //เรียก Service ที่เราใช้งาน คล้ายๆ Proxy แล้ว Set URL ที่เราต้องไปเรียก
service.process(); // เรียก Process ที่เราต้องการใช้ใน Web Service นั้น

Step By Step Generate Web Service Client By Eclipse 3.3

Step By Step Generate Web Service Client By Eclipse 3.3
เป็นวิธีการสร้าง Web Service Client ไปเรียก Web Service ในกรณีที่เรามี WSDL File อยู่แล้วนะครับ

1. ขั้นแรกโหลด Eclipse 3.3 มาก่อนโหลด ที่นี่ โหลดที่เป็นสำหรับ Java EE Developers
  • สำหรับ Eclipse 3.3 จะต้องมี JRE 1.5 ขึ้นไปครับ ต้องโหลดมาลงด้วย
2. ต่อไปเรามาสร้าง Project กัน โดยผมจะสร้างเป็น Java Project โดยคลิกขวาเลือก New --> Project ดังรูป

3. เลือก Folder ที่เป็น Java จากนั้นเลือก Java Project คลิก Next จะได้หน้าต่างดังรูป


4. จากนั้นก็พิมพ์ชื่อ Project Name ลงไป (ตรวจสอบตรงช่อง JRE ว่ามี JRE หรือเปล่า ถ้าไม่มีให้ไป คลิกที่ Configuration Default) โดย
  1. เมื่อกดเข้าไปแล้ว จะได้ดังรูป

  2. ให้ทำการ Add JRE ตรงปุ่ม Add ด้านขวามือ แล้วไปหา Folder ที่เรา Install JRE ไว้ (โดยปกติจะอยู่ที่ Program Files/Java ครับ)
  3. เมื่อ Add แล้วให้ติกเครื่องหมายถูก ก็จะได้ JRE เป็น Default ของ Eclipse แล้ว
5. หลังจากคลิก FInish แล้วจะได้ Java Project มา แล้วเราก็เอา WSDL File มาวางไว้ที่ Project
6. คลิก ขวาที่ WSDL File เลือก Web Services --> Generate Client ดังรูป

7. เมื่อเลือกแล้ว จะขึ้นหน้าต่างดังรูป (ควรตรวจสอบ Web Service Runtime ให้เป็น Apache Axis กับ Client Project เป็น Java Project ที่เราสร้างไว้ และ Client Type เป็น Java Proxy)
8. คลิก Finish ได้เลย เราจะได้ Web Service Client มาไว้ใช้งานแล้ว
9. Entry ต่อไปจะเขียนวิธีการเรียกโดยใช้ File พวกนี้ครับ ดู ที่นี่

หมายเหตุ สำหรับจะเอาไปใช้กับ Java Editor ตัวอื่นให้ Copy เฉพาะ Java File ไปใช้ ก็จะใช้งานได้เลยครับเช่น บน RAD 6.0 ก็ Copy ไปใช้งานได้เลย (แ่ต่เอามา Generate Sample JSP ไม่ได้ครับ ต้องใช้ของ RAD เอง ถึงจทำได้ครับ)