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:
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 annotatedMethod
là null
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
}
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 :) –
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
@ 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) –