JAX-RS资源无法转发至JSP文件,报UT010023错误求助
问题:RESTEasy服务转发到JSP时出现UT010023错误
访问REST服务URL时触发以下错误:
ERROR [stderr] (default task-2) java.lang.IllegalArgumentException: UT010023: Request HttpServletRequestImpl [ GET /WSService/ws/showView ] was not original or a wrapper.
相关代码细节
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app> <display-name>WSService</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> <servlet> <servlet-name>Resteasy</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> </servlet> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/showView/*</url-pattern> </servlet-mapping> <context-param> <param-name>javax.ws.rs.Application</param-name> <param-value>login.WSService</param-value> </context-param> <listener> <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> </listener> </web-app>
WSService类代码
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; @Path("/showView") public class WSService { @GET @Path("/redirect") @Produces("text/html") public void redirect(@Context HttpServletResponse response, @Context HttpServletRequest request) { try { String data = "someData"; request.setAttribute("data", data); request.getRequestDispatcher("view/view.jsp").forward(request, response); } catch (ServletException | IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
JSP文件路径
/src/main/webapp/view/view.jsp
解决方案
问题根源
RESTasy注入的HttpServletRequest是它自身实现的包装类,而Undertow容器(错误码UT010023来自Undertow)要求forward操作必须使用原始的HttpServletRequest实例或标准Servlet规范的包装请求,因此触发非法参数异常。
解决方法1:获取原始请求后转发(保留request属性传递)
修改redirect方法,递归提取原始请求实例,再执行forward:
@GET @Path("/redirect") @Produces("text/html") public void redirect(@Context HttpServletResponse response, @Context HttpServletRequest request) { try { // 递归获取原始HttpServletRequest HttpServletRequest originalRequest = request; while (originalRequest instanceof javax.servlet.http.HttpServletRequestWrapper) { originalRequest = ((javax.servlet.http.HttpServletRequestWrapper) originalRequest).getRequest(); } String data = "someData"; originalRequest.setAttribute("data", data); // 使用绝对路径定位JSP,避免相对路径错误 originalRequest.getRequestDispatcher("/view/view.jsp").forward(originalRequest, response); } catch (ServletException | IOException e) { e.printStackTrace(); } }
解决方法2:改用重定向(无需传递request属性时适用)
如果不需要通过request传递属性,可直接用客户端重定向:
@GET @Path("/redirect") @Produces("text/html") public void redirect(@Context HttpServletResponse response) { try { // 若需传递参数,拼接在URL后 response.sendRedirect("../view/view.jsp?data=someData"); } catch (IOException e) { e.printStackTrace(); } }
额外优化
- 调整类上的
@Path:将@Path("/showView")改为@Path("/"),结合web.xml的/showView/*映射,访问路径可简化为/showView/redirect。 - 始终使用绝对路径(以
/开头)调用getRequestDispatcher,避免因当前请求路径导致的JSP定位错误。
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

