当前位置: 首页 > 知识库问答 >
问题:

如何通过Spring MVC测试避免“圆形视图路径”异常

吴俊风
2023-03-14

我的一个控制器中有以下代码:

@Controller
@RequestMapping("/preference")
public class PreferenceController {

    @RequestMapping(method = RequestMethod.GET, produces = "text/html")
    public String preference() {
        return "preference";
    }
}

我只是想用Spring MVC测试来测试它,如下所示:

@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {

    @Autowired
    private WebApplicationContext ctx;

    private MockMvc mockMvc;
    @Before
    public void setup() {
        mockMvc = webAppContextSetup(ctx).build();
    }

    @Test
    public void circularViewPathIssue() throws Exception {
        mockMvc.perform(get("/preference"))
               .andDo(print());
    }
}

我得到以下例外:

圆形视图路径[首选项]:将再次调度回当前处理程序URL[/首选项]。检查您的ViewResolver设置!(提示:由于默认视图名称生成,这可能是未指定视图的结果。)

我觉得奇怪的是,当我加载包含模板和视图解析器的“完整”上下文配置时,它工作正常,如下所示:

<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" id="webTemplateResolver">
    <property name="prefix" value="WEB-INF/web-templates/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="characterEncoding" value="UTF-8" />
    <property name="order" value="2" />
    <property name="cacheable" value="false" />
</bean>

我很清楚,模板解析器添加的前缀确保应用程序使用该模板解析器时不会出现“循环视图路径”。

那么,我应该如何使用Spring MVC测试来测试我的应用程序呢?

共有3个答案

胡承载
2023-03-14

这与Spring MVC测试无关。

当您没有声明ViewResolver时,Spring会注册一个默认的InternalResourceViewResolver,它创建JstlView的实例以呈现View

JstlView类扩展InternalResourceView,它是

同一web应用程序中JSP或其他资源的包装器。将模型对象公开为请求属性,并使用javax将请求转发到指定的资源URL。servlet。请求调度员。

此视图的URL应该指定web应用程序中的资源,适合RequestDispatcher的forward或include方法。

强调我的。换句话说,视图在渲染之前会尝试获取一个Request estDispatcher向其转发()。在执行此操作之前,它会检查以下内容

if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) {
    throw new ServletException("Circular view path [" + path + "]: would dispatch back " +
                        "to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " +
                        "(Hint: This may be the result of an unspecified view, due to default view name generation.)");
}

其中path是视图名称,即您从@Controller返回的内容。在本例中,即首选项。变量uri保存正在处理的请求的uri,即/上下文/首选项

上面的代码意识到,如果您要转发到/上下文/首选项,相同的servlet(因为之前处理的相同)将处理请求,您将进入一个无休止的循环。

当您声明一个thymeleafviewsolver和一个带有特定前缀后缀ServletContextTemplateResolver时,它以不同的方式构建视图,给它一个类似

WEB-INF/web-templates/preference.html

ThymeleafView实例通过使用ServletContextResourceResolver定位相对于ServletContext路径的文件

templateInputStream = resourceResolver.getResourceAsStream(templateProcessingParameters, resourceName);`

最终

return servletContext.getResourceAsStream(resourceName);

这将获取一个相对于ServletContext路径的资源。然后,它可以使用模板引擎生成HTML。这里不可能有无休止的循环。

卫仲卿
2023-03-14

我使用@ResponseBody解决了这个问题,如下所示:

@RequestMapping(value = "/resturl", method = RequestMethod.GET, produces = {"application/json"})
    @ResponseStatus(HttpStatus.OK)
    @Transactional(value = "jpaTransactionManager")
    public @ResponseBody List<DomainObject> findByResourceID(@PathParam("resourceID") String resourceID) {
公羊涛
2023-03-14

@Controller→ <代码>@RestController

我有同样的问题,我注意到我的控制器也用@Controller注释。用@RestController替换它解决了这个问题。这是Spring Web MVC的解释:

@RestController是一个组合注释,它本身用@Controller和@回应体进行元注释,指示一个控制器,其每个方法都继承类型级@回应体注释,因此直接写入响应体vs视图分辨率和渲染使用超文本标记语言模板。

 类似资料:
  • 问题内容: 我的一个控制器中有以下代码: 我只是想使用Spring MVC测试来测试它,如下所示: 我收到以下异常: 循环视图路径[preference]:将再次分派回当前处理程序URL [/ preference]。检查您的ViewResolver设置!(提示:由于默认视图名称的生成,这可能是未指定视图的结果。) 我感到奇怪的是,当我加载包含模板和视图解析器的“完整”上下文配置时,它工作正常,如

  • 我正在使用spring mvc,视图抛出500错误。在控制台上获取错误

  • //运行此代码时,日志中显示了此错误- Servlet。带有路径[]的上下文中servlet[dispatcherServlet]的service()引发了异常[Circular view path[Students]:将再次分派回当前处理程序URL[/Students]。检查ViewResolver设置!(提示:这可能是由于生成默认视图名称而导致的未指定视图的结果。)]具有根本原因“

  • 我在火花站点上运行了单源最短路径(SSSP)示例,如下所示: Grax-SSSP预凝胶实例 代码(scala): sourceId:0获取结果: (0,0.0) (4,2.0) (2,1.0) (3,1.0) (1,2.0) 但是我需要如下实际路径: = 如何通过spark graphX获得SSSP实际路径<有人给我一些提示吗<谢谢你的帮助

  • 我想做一个圆形的表面视图。我找了很多,但找不到好的解决办法。我现在正在做的是,我将SurfaceView放入一个FrameLayout,然后在它上面放置另一个视图,要么使用PNG掩码,要么使用可绘制的形状xml。给你 但这不是一个好的解决方案,也不是完美的解决方案。我想将surfaceview自定义为圆形。任何帮助都将不胜感激。谢谢:)

  • 漏测,是指产品的缺陷没有被测试人员发现而遗漏到了用户那里,影响用户使用!