หน้าเว็บ

วันจันทร์ที่ 21 กรกฎาคม พ.ศ. 2557

แก้ปัญหา GlassFish Application Server โหลด JPA EclipseLink ตัวเก่า


        โดยปกติแล้ว  เวลาเราใช้งาน JPA (EclipseLink) เราไม่จำเป็นต้อง add libraries หรือ dependencies เพิ่มเติมเข้ามาใน project เราก็สามารถใช้งาน jpa ได้ทันที (feature ของ application server : GlassFish) เพราะ jpa มันเป็น spec อยู่แล้ว application server ก็เลยอำนวยความสะดวกตรงนี้ให้เรา

        แต่ถ้าบางครั้งเราต้องการ config JPA เอง หรือต้องการ feature ของ JPA ที่มากกว่าที่ application server เตรียมมาให้  เราต้องทำการบอก application server (GlassFish) ว่าให้มาอ่าน config จากเราไปแทน เช่น ปัจจุบัน  ผมใช้ GlassFish 4.0 ในการพัฒนา project ตัว GlassFish จะมี EclipseLink 2.3.2.X แถมมาให้  แต่ผมต้องการใช้ EclipseLink 2.4.2 (ต้องการใช้ LEFT JOIN)  ซึ่งถ้าเราเขียน JPQL แบบใหม่  แต่ใช้ JPA ตัวเก่า  เราก็จะ run project ไม่ผ่าน

วิธีแก้
1. add dependencies EclipseLink ที่เราต้องการ เพิ่มเข้าไปใน pom.xml
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.4.2</version>
</dependency>
2. ที่ glassfish-web.xml ให้เปลี่ยน <class-loader delegate="true"/> ไปเป็น <class-loader delegate="false"/>
เพื่อให้ glassfish มาอ่าน dependencies configuration ที่เรา config ไว้ใน pom.xml  (ไม่ต้อง delegate ไปให้ glassfish จัดการ)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <context-root>/myApp</context-root>
  <class-loader delegate="false"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</glassfish-web-app>

ลอง clean and build project ดูใหม่ แล้วลอง run ดูอีกทีครับ
แค่นี้  ก็ใช้งานได้ตามปกติแล้วครับ :)

ที่มาของภาพประกอบ http://www.trendhunter.com/trends/glass-fish-bowl

ไม่มีความคิดเห็น:

แสดงความคิดเห็น