【问题标题】:Unable to get string response from Spring mapping无法从 Spring 映射中获取字符串响应
【发布时间】:2014-08-26 21:46:34
【问题描述】:

我一直在从事基于 Spring 的 Web 项目。大多数端点都设置为返回 XML,并且使用 REST 编组器可以正常工作。作为项目演示的一部分,我想要一个仪表板,以更易于阅读的格式显示数据。

问题是,我无法让端点返回一个字符串。当我尝试访问端点时,我收到以下错误消息:

JBWEB000065: HTTP Status 406 -

JBWEB000309: type JBWEB000067: Status report

JBWEB000068: message

JBWEB000069: description JBWEB000126: The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request 'Accept' headers. 

映射请求代码如下:

@RequestMapping(value="/dash", method=RequestMethod.GET, headers="Accept=*/*",produces="text/plain")
@ResponseBody
public String customerPortal()
{
  return "WEB-INF/jsp/Dash.jsp";
}

其他(XML)端点工作正常,文件本身存在。在这一点上,我会接受任何将 HTML 传输到浏览器的方式,我不需要任何花哨的东西,只需要一个不会违反 AJAX 单一来源限制的文件。如果有一个简单的解决方案,我深表歉意,我已经尝试了六种不同的解决方案,但找不到任何方法让服务器发送除 XML 之外的任何内容。

编辑:删除@ResponseBody、方法、标头并生成注释后,它现在给出以下响应:

JBWEB000065: HTTP Status 500 - Could not resolve view with name '/WEB-INF/jsp/ScorpioDash.jsp' in servlet with name 'scorpio-restservice'

JBWEB000309: type JBWEB000066: Exception report

JBWEB000068: message Could not resolve view with name '/WEB-INF/jsp/ScorpioDash.jsp' in servlet with name 'scorpio-restservice'

JBWEB000069: description JBWEB000145: The server encountered an internal error that prevented it from fulfilling this request.

JBWEB000070: exception

javax.servlet.ServletException: Could not resolve view with name '/WEB-INF/jsp/ScorpioDash.jsp' in servlet with name 'scorpio-restservice'
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1190)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

【问题讨论】:

  • 您在向/dash 发送请求时发送了哪些Accept 标头?
  • 此方法返回 Spring 必须转发到的视图的名称。所以它返回的不是响应体。所以不应该用ResponseBody注解。
  • 另外,您很可能没有返回正确的字符串以转发到视图(取决于您如何设置视图解析器)
  • 老实说,我不知道接受标头是什么。如果有帮助,我正在尝试从浏览器访问它。至于响应主体,我实际上是在寻找任何类型的响应。我希望以某种方式让 servlet 返回浏览器可以显示的任何内容。它不需要漂亮,我只需要让它工作。
  • headers@Requestmapping中去掉,你就可以专注于上面提到的其他潜在问题了。

标签: java spring spring-mvc


【解决方案1】:

终于找到答案了。在 scorpio-restservice-servlet.xml 文件(我没有发布,抱歉)我没有定义 InternalResourceViewResolver。添加以下内容:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/static/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

修复了这个问题,让它可以漂亮地渲染 .jsp 文件。非常感谢大家的帮助。

【讨论】:

  • 这仅在您删除 @ResponseBody 注释后有效。在答案中添加这一点很重要。
  • 正确,这就是我问预期结果的原因。让 JSP 呈现与查看文件的内容完全不同。
  • 您还应该在解析器上设置一个前缀,以避免在控制器中执行完整的WEB-INF/jsp 路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2016-08-28
  • 2022-11-12
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多