0

cxf-rt-frontend-jaxrs2.7.7を使用して、いくつかの残りのサービスをすでに実行しています

/myservice/customers
/myservice/items

私の休息サービスは 2 つのエンドポイントを提供します。

@Component
public class CustomerService {
    @GET
    @Path("customers")
    @Produces({MediaType.APPLICATION_JSON})
    public ... getCustomers() { ... }

    @GET
    @Path("items")
    @Produces({MediaType.APPLICATION_JSON})
    public ... getItems() { ... }
}

これはうまく機能し、いくつかの jsp ページを追加したいと思います。

Redirecting requests and serve static contentについて読んだことがありますが、それを機能させることができず、 と の構成について混乱していweb.xmlますapplicationContext.xml

これが私がこれまでに持っているものです:

web.xml

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

applicationContext.xml

<jaxrs:server id="rest" address="/">
    <jaxrs:serviceBeans>
        <ref bean="customerWebService" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
        <ref bean="dispatchProvider"/>
    </jaxrs:providers>
</jaxrs:server>

<bean id="dispatchProvider" class="org.apache.cxf.jaxrs.provider.RequestDispatcherProvider">
    <property name="dispatcherName" value="jsp"/>
    <property name="resourcePath" value="/admin/item.jsp"/>
    <property name="beanNames">
        <map>
            <entry key="com.company.domain.Item" value="item"/>
        </map>
    </property>
</bean>

jspページ

という名前の jsp Web ページitem.jspを webapp/WEB-INF に配置しました。

<%@ page import="com.company.domain.Item" %>
<%
    Item item = (Item) request.getAttribute("item");
%>
<html>
  <head></head>
  <body>
    Item: <%= item.getEnglishName() %>.
  </body>
</html>

エラー

開く/customerservice/itemsと、残りのサービスから有効な JSON 応答を受け取ります。

ただし、開く/customerservice/admin/item.jspと次のようになります。

[10:34:45.791] [qtp104543434-33] 警告 JAXRSUtils - 要求パス "/customerservice/admin/item.jsp" に一致する操作が見つかりません。相対パス: /admin/item.jsp、HTTP メソッド: GET、ContentType: / , 受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9, /;q=0.8,. 詳細については、FINE/TRACE ログ レベルを有効にしてください。[10:34:45.796] [qtp104543434-33] エラー DefaultExceptionMapper - DefaultExceptionMapper が応答を返しました: 内部サーバー エラー javax.ws.rs.ClientErrorException: null at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java: 503) ~[cxf-rt-frontend-jaxrs-2.7.7.jar:2.7.7] org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:227) で ~[cxf-rt-frontend -jaxrs-2.7.7.jar:2.7.7] at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:103) ~[cxf-rt-frontend-jaxrs-2.7.7.jar: 2.7.7] org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) で [cxf-api-2.7.7.jar:2.7.7] org.apache.cxf.transport.ChainInitiationObserver で。

私は何を間違っていますか?

web.xml に別個のサーブレットと URL マッピングが必要ですか?

リクエスト ディスパッチャにはさらに設定が必要ですか (dispatcherNameプロパティなど)?

ご指導いただきありがとうございます。

4

1 に答える 1

1

CXFServlet url-pattern を /rest/* に変更しました

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

私の残りのURLは今/customerservice/rest/items/customerservice/rest/customers.

そして今/customerservice/admin/item.jsp、jsp ページが webapp/admin (webapp/WEB-INF/admin ではなく) の下に配置されているときに、 url に対する応答を受け取ります。これは正しいと思います。

リクエストがデフォルトのApache jasper JspServlet(私はまったく設定していません)に「フォールスルー」しているようです。

応答:

Hello World.

最初のコメントをくれた Lutz に感謝します。

ここで、いくつかの Bean を jsp ページに注入する必要があります。おそらく、exposeContextBeansAsAttributesここで使用できるようなものがあるでしょう。

于 2013-11-14T10:46:50.423 に答える