2012-11-21 15 views
10

Chúng tôi đang cố gắng đưa ra tất cả các chú thích từ các lớp học của chúng tôi và định cấu hình nó trong một spring-config.xml.Dịch vụ REST: cách chỉ định chú thíchMethod mà không sử dụng chú thích

spring-config.xml trông giống như

<jaxrs:server id="restServer" address="/rest/"> 
     <jaxrs:model id="restModel"> 
      <jaxrs:resource name="com.csc.fs.rest.contact.RetrieveContactHistoryBP" path="retrieveContactHistoryBP"> 
       <jaxrs:operation name="retrieve" path="{partyId}" consumes="application/json" produces="application/json" verb="GET"> 
        <jaxrs:param name="req" type="CONTEXT"/> 
        <jaxrs:param name="partyId" type="PATH"/> 
       </jaxrs:operation> 
      </jaxrs:resource> 
      <jaxrs:resource name="com.csc.fs.rest.contact.StartContactBP" path="startContactBP"> 
       <jaxrs:operation name="startContact" path="/" consumes="application/json" produces="application/json" verb="PUT"> 
        <jaxrs:param name="req" type="CONTEXT"/> 
        <jaxrs:param name="startContact" type="REQUEST_BODY"/> 
       </jaxrs:operation> 
      </jaxrs:resource> 
     </jaxrs:model> 
     <jaxrs:serviceBeans> 

bây giờ khi tôi nhấn vào dịch vụ tiếp xúc: enter image description here

tôi nhận được những dấu vết sau:

HTTP Status 500 - 
________________________________________ 
type Exception report 
message 
description The server encountered an internal error() that prevented it from fulfilling this request. 
exception 
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault 
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:102) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315) 
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) 
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105) 
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188) 
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
root cause 
org.apache.cxf.interceptor.Fault 
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:67) 
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315) 
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) 
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105) 
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) 
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188) 
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
root cause 
java.lang.NullPointerException 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleOperation(WadlGenerator.java:310) 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleResource(WadlGenerator.java:253) 
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleRequest(WadlGenerator.java:185) 
    org.apache.cxf.jaxrs.impl.RequestPreprocessor.checkMetadataRequest(RequestPreprocessor.java:189) 
  

tôi đã debug vào CXF-jaxrs nguồn và tại dòng

java.lang.NullPointerException 
     org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleOperation(WadlGenerator.java:310) 

phương pháp tìm kiếm annotatedMethod nhưng đối tượng có trường annotatedMethodnull do đó sẽ phát ra lỗi.

tôi có thể làm cho nó hoạt động bằng cách sử dụng chú thích trong lớp ở trên phương pháp. Nhưng tôi muốn nó hoạt động thông qua cấu hình xml.

tôi đã xác định

<jaxrs:operation name="retrieve" path="{partyId}" consumes="application/json" produces="application/json" verb="GET"> 

các retrieve là hoạt động được gọi. những gì thuộc tính khác cần phải được thiết lập chỉ định ?? hoặc là nó chỉ là một hạn chế của cấu hình xml?

PS: nếu bạn cảm thấy cần phải thêm hoặc làm rõ thêm một số thông tin, hãy để lại nhận xét. Mới đối với các dịch vụ RESTful và không chắc chắn tất cả thông tin được mong đợi trong ngữ cảnh này.

UPDATE:

lớp dịch vụ

//@Path("/startContactBP") 
public class StartContactBP { 
    //@PUT 
    //@Consumes(MediaType.APPLICATION_JSON) 
    //@Produces(MediaType.APPLICATION_JSON) 
    //@Path ("/") 
    //public com.csc.fs.ws.contact.StartContactResult startContact(@Context HttpServletRequest req, com.csc.fs.ws.contact.StartContact startContact){ 
    public com.csc.fs.ws.contact.StartContactResult startContact(HttpServletRequest req, com.csc.fs.ws.contact.StartContact startContact){ 

     //call login 
      //call actual service 
      //call logoff 
    } 

Trả lời

1

Từ những gì tôi có thể thấy CXF không nhất thiết phải chờ đợi phương pháp này được chú thích, WadlGenerator chỉ đơn giản là gọi một phương thức trên một thể hiện của lớp OperationResourceInfo đó xảy ra được gọi là getAnnotatedMethod. Điều này có thể là do các nhà phát triển chỉ lười biếng và không nêu tên phương pháp này một cách công phu.

Đề xuất của tôi là để gỡ lỗi cao hơn trong ngăn xếp theo dõi để xem những gì đang tạo ra các thể hiện của lớp OperationResourceInfo, từ đó bạn sẽ có thể xem nếu tạo này là đi sai.

Ngoài phiên bản CXf bạn đang sử dụng? Đảm bảo nó mới nhất.

Ngoài sự tò mò là có lý do nào khiến bạn muốn cấu hình XML thay vì chú thích không?

+0

naah .. không có lý do nào như vậy khi sử dụng xml. Chỉ _Requirements_ được tạo ra bởi các kiến ​​trúc sư tin rằng ___ "nếu anh ta có thể đặt thêm một lớp nữa, anh ta có thể cai trị thế giới" ___ lol :) –

+0

Tôi cảm thấy nỗi đau của bạn tin tôi! Mặc dù tôi phải thừa nhận đó là một trò đùa thực sự để thay đổi một cái gì đó hoạt động. Tôi không muốn nhận được thành tích của XML vs Annotations nhưng tôi thích chú thích cho tôi có thể mở một lớp và xem cách mọi thứ được kết nối với nhau mà không cần phải mở một tập tin XML quá ... – ramsinb

+0

@ Tôi biết, bất kỳ nhà phát triển sẽ đồng ý với điều đó.Ngoài ra tôi cũng thích các chú thích, nhưng bạn sẽ làm gì khi "Kiến trúc sư" trên ___Voyage để cai trị thế giới___ ;-), dù sao, tôi sẽ thử điều đó vào buổi sáng và cập nhật bài đăng với những phát hiện của tôi. Cảm ơn bạn (y) –