ฉันได้ใช้การติดตั้ง jersey ของ jaxrs แต่ฉันไม่สามารถใช้งานโปรแกรมได้ ต่อไปนี้คือกรณีที่ฉันกำลังประสบปัญหา ความคิดใด ๆ ช่วยฉันด้วย
ในโปรแกรมต่อไปนี้ ฉันใช้ jersy 2.x Implementaion ของ jaxrs ฉันนำโปรแกรมไปใช้โดยใช้ jersey implemetation ของ jax-rs (restfull) 2 คลาส ฉันได้เขียนแทน web.xml ฉันใช้คลาส
MyResource.java
package com.rest.application; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import com.rest.webservice.SampleService; @ApplicationPath("rest") public class MyResource { private Set s; public MyResource() { s=new HashSet(); s.add(new SampleService()); } public Set getSingletons() { return s; } }
SampleService.java
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Path("sample") public class SampleService { @GET @Produces("text/html") @Path("{username}") public String sayHello(@PathParam("username")String s) { return "<font color='blue' size=8>Hello:" +s+ "</font>"; } @GET @Produces("text/plain") public String sayBye() { return "Bye"; } }
ฉันเพิ่มขวดทั้งหมดที่จำเป็นสำหรับโปรแกรมนี้แล้ว แต่ยังคงได้รับข้อผิดพลาดดังต่อไปนี้
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]. StandardHost[localhost].StandardContext[/RestApp2]] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]. StandardHost[localhost].StandardContext[/RestApp2]]
เหมือนข้อผิดพลาดเดียวกันนี้แสดงทุกที่
เมื่อฉันเปลี่ยนเซิร์ฟเวอร์ tomcat 7 เป็น 6 มันใช้งานได้ แต่ไม่แสดงผลลัพธ์ ใครมีความคิดใด ๆ ขอบคุณล่วงหน้า
ใน jersey 2.x ฉันได้รับข้อผิดพลาดเช่น java.util.concurrent.ExecutionException
คำตอบ (2)
สิ่งนี้ กล่าวว่า @ApplicationPath("rest")
อาจใช้ได้กับเฉพาะกับ คลาสย่อยของแอปพลิเคชัน
คุณสามารถแบ่งปันเพิ่มเติมเกี่ยวกับสิ่งที่คุณพยายามทำและการติดตามสแต็กที่สมบูรณ์คืออะไร คุณใช้ web.xml หรือไม่?
ตามที่ @MSD กล่าวถึง การใช้ @ApplicationPath
ของคุณไม่ถูกต้อง ดูเอกสารประกอบของ Jersey ในการปรับใช้แอปพลิเคชัน เพื่อดูตัวเลือกการใช้งานต่างๆ ทั้งหมด และ วิธีการทำงานในสภาพแวดล้อมที่แตกต่างกัน
โดยพื้นฐานแล้ว วิธีที่ง่ายที่สุดคือการใส่ @ApplicationPath
ไว้ในคลาส Application
ที่ว่างเปล่า
@ApplicationPath("/rest")
public class MyApplication extends Application {}
วิธีนี้จะสแกนคลาสพาธทั้งหมดสำหรับคลาสที่มีคำอธิบายประกอบ @Provider
และ @Path
เพื่อลงทะเบียนกับแอปพลิเคชัน แม้ว่าวิธีนี้อาจดูง่ายกว่า แต่แนวทางทั่วไปเมื่อทำงานกับ Jersey คือการใช้ ResourceConfig
คลาส ซึ่งเป็นคลาสย่อยของ Application
คุณสามารถลงทะเบียนแพ็คเกจซึ่งจะสแกนแพ็คเกจและแพ็คเกจย่อย
@ApplicationPath("/rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.my.packages");
}
}
ข้อดีประการหนึ่งคือบางครั้งจะมีการขึ้นต่อกันของบุคคลที่สามซึ่งมีคำอธิบายประกอบ แต่คุณไม่ต้องการลงทะเบียน หากต้องการลงทะเบียนแต่ละคลาส เพียงใช้ register(...class)
ใน ResourceConfig
ตอนนี้สาเหตุของข้อผิดพลาดใน Tomcat 7 ไม่ใช่ 6 น่าจะเป็นเพราะ Tomcat 6 (servlet 2.5) ไม่มีกลไกความสามารถในการเสียบปลั๊ก sevlet ซึ่งใช้ ServletContainerInitializer
การใช้งาน Jersey ของตัวเริ่มต้นนี้จะโหลดแอปพลิเคชัน โดยค้นหา @ApplicationPath
ในคลาสย่อย Application
หากคุณไม่ได้อยู่ในสภาพแวดล้อม 3.0 ฟังก์ชันนี้จะไม่ทำงาน
โปรดทราบว่าตัวเริ่มต้น Jersey จะรวมอยู่ในโถ jersey-container-servlet
คุณสามารถอ่านเพิ่มเติมได้ที่นี่