ใน jersey 2.x ฉันได้รับข้อผิดพลาดเช่น java.util.concurrent.ExecutionException

  1. ฉันได้ใช้การติดตั้ง 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 มันใช้งานได้ แต่ไม่แสดงผลลัพธ์ ใครมีความคิดใด ๆ ขอบคุณล่วงหน้า


person Anil Amane    schedule 09.06.2015    source แหล่งที่มา
comment
กรุณาล้างรหัสของคุณ...ไม่สามารถอ่านได้   -  person Rash    schedule 09.06.2015


คำตอบ (2)


สิ่งนี้ กล่าวว่า @ApplicationPath("rest") อาจใช้ได้กับเฉพาะกับ คลาสย่อยของแอปพลิเคชัน

คุณสามารถแบ่งปันเพิ่มเติมเกี่ยวกับสิ่งที่คุณพยายามทำและการติดตามสแต็กที่สมบูรณ์คืออะไร คุณใช้ web.xml หรือไม่?

person MSD    schedule 09.06.2015

ตามที่ @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 คุณสามารถอ่านเพิ่มเติมได้ที่นี่

person Paul Samsotha    schedule 10.06.2015