簡體   English   中英

使用REST根資源類作為接口,獲取“無操作匹配請求”

[英]Using REST root resource class as interface, getting “no operation matching request”

問題:根資源類定義為具有所有注釋的接口。 CXFServlet無法在impl類上看到POST操作,盡管它是在接口上定義的。 當所有注釋都復制到impl類中時,它可以正常工作。

注意:僅在接口上定義GET才能正常工作,只有POST導致問題。

@Path("foo/")
public interface TestService {
    @Path("foo/{id}")
    @GET
    @Produces("text/plain")
    public String getIt(String id);

@Path("foo")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@ElementClass(response = Bar.class)
public Response createStuff(@Context MessageContext context,
        Bar bar);

}

@Features(features = "org.apache.cxf.feature.LoggingFeature")  
public class TestServiceImpl implements TestService {
    @Override
    public String getIt(String id) {
        return "Hi there!";
    }
@Override
public Response createStuff(@Context MessageContext context,
        Bar bar) {
    bar.set...
    bar.set...
    return Response.ok(bar).build();

}

Beans.xml {

<jaxrs:server id="testService" address="/test">
        <jaxrs:serviceBeans>
            <ref bean="testservice1"/>
        </jaxrs:serviceBeans>
    </jaxrs:server>
    <bean id="testservice1" class="foo.bar.TestServiceImpl"/>

}

在web.xml

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    ……..
    </listener>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

從Tomcat7.0服務器打印的Reuest:使用Chrome Postman

信息:入站消息

ID:1

Address: http://localhost:8080/<war-name>/test/foo/foo
Encoding: ISO-8859-1
Http-Method: POST
Content-Type: application/json
Headers: {Accept=[*/*], accept-encoding=[gzip,deflate,sdch], accept-language=[en-US,en;q=0.8], cache-control=[no-cache], connection=[keep-alive], Content-Length=[144], content-type=[application/json], host=[localhost:8080], origin=[chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm], user-agent=[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36]}
Payload: {
    "bar": {
        "create_time": "Fri Sep 20 17:51:40 PDT 2013",
        "update_time": "e0739141-1e8c-48ad-b8ad-410331b3dba3",
    }
}

錯誤: 2013年9月21日下午12:13:05 org.apache.cxf.jaxrs.utils.JAXRSUtils findTargetMethod警告: 找不到匹配請求路徑的操作“// test / foo / foo”,相對路徑:/ foo,HTTP方法:POST,ContentType:application / json,Accept: / ,. 請啟用FINE / TRACE日志級別以獲取更多詳細信息。 2013年9月21日下午12:13:05 org.apache.cxf.interceptor.LoggingOutInterceptor

INFO: Outbound Message
---------------------------
ID: 1
Response-Code: 404
Content-Type: text/xml
Headers: {Allow=[GET, OPTIONS, HEAD], Date=[Sat, 21 Sep 2013 19:13:05 GMT], Content-Length=[0]}

我自己想出了問題。 在imll類方法中,不要使用注釋重新聲明params。

在Impl類中的這個片段中

@Override
public Response createStuff(*@Context* MessageContext context,
        Bar bar) {

我不必要地使用了@Context注釋,這就是拋棄它。 一旦我從impl類中刪除了注釋,它就可以正常工作。 這是正確的,為什么在界面中指定它時再次裝飾方法params。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM