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 serving static content,但我无法让它工作,而且我对web.xmland中的配置感到困惑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>

应用程序上下文.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网页命名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] WARN 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] 在 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 中是否需要单独的 servlet 和 url 映射?

我的请求调度程序是否需要更多配置(例如dispatcherName属性)?

非常感谢您的任何指导。

4

1 回答 1

1

我将 CXFServlet url-pattern 更改为 /rest/*

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

我的休息网址现在是/customerservice/rest/items/customerservice/rest/customers

现在我得到了 url 的响应/customerservice/admin/item.jsp,当我的 jsp 页面放在 webapp/admin (不是 webapp/WEB-INF/admin)下时,我认为这是正确的。

似乎请求“通过”到默认的 apache jasper JspServlet(我没有以任何方式配置)。

响应:

Hello World.

太好了,感谢 Lutz 的初步评论!

现在我需要在jsp页面中注入一些bean,也许exposeContextBeansAsAttributes我可以在这里使用类似的东西。

于 2013-11-14T10:46:50.423 回答