You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:53:10