我已经使用cxf-rt-frontend-jaxrs
2.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.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页面
我已将名为
item.jsp
的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
,我将从rest服务收到有效的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:空
在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.onMessage(ChainInitiationObserver.java:121)[cxf-api-2.7.7.jar:2.7.7]
在org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)[cxf-rt-transports-http-2.7.7.jar:2.7.7]
在org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)[cxf-rt-transports-http-2.7.7.jar:2.7.7]
在org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)[cxf-rt-transports-http-2.7.7.jar:2.7.7]
在org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)[cxf-rt-transports-http-2.7.7.jar:2.7.7]
我究竟做错了什么?
我的web.xml是否需要单独的servlet和url映射?
我的请求分配器是否需要更高级的配置(例如
dispatcherName
属性)?非常感谢您的指导。
最佳答案
我将CXFServlet网址格式更改为/ rest / *
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
我的其余URL现在是
/customerservice/rest/items
和/customerservice/rest/customers
。现在,当我将jsp页面放在webapp / admin(不是webapp / WEB-INF / admin)下时,我得到对URL
/customerservice/admin/item.jsp
的响应,我认为这是正确的。似乎该请求“落入”了默认的apache jasper JspServlet(我没有以任何方式进行配置)。
响应:
Hello World
。太好了,感谢Lutz的初步评论!
现在,我需要在jsp页面中注入一些bean,也许这里可以使用
exposeContextBeansAsAttributes
之类的东西。关于java - JAX-RS休息服务运行正常。如何添加JSP页面?卡住配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19974191/