【问题标题】:REST services : how to specify annotatedMethod without using annotationsREST 服务:如何在不使用注释的情况下指定 annotatedMethod
【发布时间】:2012-11-21 11:26:26
【问题描述】:

我们正在尝试从我们的类中取出所有注释并将其配置在 spring-config.xml 中。

spring-config.xml 看起来像

<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>

现在当我点击公开的服务时:

我得到以下跟踪:

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)
 

我确实调试到 cxf-jaxrs 源代码和行

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

该方法搜索annotatedMethod,但该对象的annotatedMethod 字段为null,因此会引发错误。

我可以使用方法上方的类中的注释让它工作。但我希望它能够通过 xml 配置工作。

我已经指定了

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

retrieve 是要调用的操作。还需要设置哪些其他属性?还是只是xml配置的限制?

PS:如果您觉得需要添加或澄清更多信息,请离开 cmets。刚接触 RESTful 服务,不确定在此上下文中需要哪些所有信息。

更新:

服务等级

//@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
    }

【问题讨论】:

    标签: java web-services rest jaxb jax-rs


    【解决方案1】:

    据我所知,CXF 并不一定希望方法被注释,WadlGenerator 只是调用类OperationResourceInfo 的实例上的方法,而该实例恰好被称为getAnnotatedMethod。这可能是因为开发人员只是懒惰并且没有适当地命名方法。

    我的建议是在堆栈跟踪中进行更高级别的调试,以查看创建类 OperationResourceInfo 的实例的原因,从中您应该能够查看此创建是否出错。

    此外,您使用的是哪个版本的 CXf?确保它是最新的。

    出于好奇,您有什么理由选择 XML 配置而不是注释?

    【讨论】:

    • naah.. 没有使用 xml 的理由。只是要求由相信“如果他可以再增加一层,他就可以统治世界”的建筑师提出的要求哈哈:)
    • 我感觉到你的痛苦相信我!虽然我必须承认,改变一些有效的东西是一个真正的笑话。我不想深入了解 XML 与注释的优点,但我更喜欢注释,因为我可以打开一个类并查看事物是如何连接在一起的,而无需打开 XML 文件......
    • @是的,我知道,任何开发人员都会同意这一点。我也喜欢注释,但是当“建筑师”在统治世界的航行时你会怎么做;-),无论如何,我会试试看早上用我的发现更新帖子。谢谢(y)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多