【问题标题】:Spring MVC test - Injecting a mock repository when ever the integration test requires a specific typeSpring MVC 测试 - 当集成测试需要特定类型时注入模拟存储库
【发布时间】:2016-03-13 14:59:58
【问题描述】:

我使用 spring mvc 3 编写了一个 Web 应用程序。它提供了一个返回 JSON 的单一端点。我确实使用 url 参数成功运行了它,但现在我需要将其更改为使用路径变量。

我换了控制器

来自:

@Controller
public class DataController {

    @Autowired
    private IDataService dateService;

    @RequestMapping(
            value = "/some/data",
            method = RequestMethod.GET,
            produces = "application/json"
    )
    public @ResponseBody Data getDataByCode(@RequestParam String code) {
        return versionService.getDataByCode(code);
    }
}

到:

@Controller
public class DataController {

    @Autowired
    private IDataService dateService;

    @RequestMapping(
            value = "/some/data/{code}",
            method = RequestMethod.GET,
            produces = "application/json"
    )
    public @ResponseBody Data getDataByCode(@PathVariable String code) {
        return versionService.getDataByCode(code);
    }
}

和我的 web xml 来映射 url...

来自:

    <servlet>
        <servlet-name>dataBycode</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/config/servlet-config.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/some/data</url-pattern>
    </servlet-mapping>

到:

    <servlet>
        <servlet-name>dataBycode</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/config/servlet-config.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/some/data/*</url-pattern>
    </servlet-mapping>

但是我得到了 http 请求的 404:http://localhost/some/data/1234 我知道 1234 存在的地方。

最重要的是,请求甚至没有到达控制器方法,所以它必须是 web xml url 模式配置。

作为测试,我尝试更改 url 模式以完全匹配带有代码的请求,它按预期返回 JSON,所以我知道它的 url 模式。我只是不知道如何解决它。

我试过了:

  1. /
  2. /*
  3. /一些/数据*
  4. /一些/数据/*

【问题讨论】:

  • 你的 Spring 配置是如何加载的?
  • 它是通过 xml 配置加载的,你认为这会对应用程序使用路径变量以外的任何东西产生影响吗?如果是这样,那么我将在问题中添加该细节。如果我不使用路径变量,请按预期记住应用程序功能。例如,它可以使用路径参数作为 code 值。
  • 确实 spring 配置应该不是问题。我添加了一些提示的答案。

标签: java spring-mvc url-pattern path-variables


【解决方案1】:

你的 url-pattern 应该是:

  <servlet-mapping>
        <servlet-name>dataBycode</servlet-name>
        <url-pattern>/</url-pattern>
  </servlet-mapping>

第二手,你能不能尝试访问http://localhost/some/data/myTest,在你的getDataByCode方法里放一个System.out.println,看看是否调用了这个方法。

如果可行,我认为问题来自 Spring MVC,它将“1234”解释为整数而不是字符串。

【讨论】:

  • 有趣的我会试试这个并回复你
  • 我把url模式改成了/,现在好像可以用了,最后路径变量类型没有问题。
  • 奇怪的是我过去曾尝试过,也许我的配置已经改变,因为我发布了这个问题来解决更深层次的问题。
【解决方案2】:

如果您使用的是 Eclipse:

  1. 在服务器视图中双击您的服务器

  1. 转到模块选项卡

  1. 检查您的应用程序的路径

最终应用url = path + some/data/1234

【讨论】:

  • 正如我在问题中所说,我知道路径是正确的,因为我可以允许访问我的 web.xml url 格式中的特定值并返回预期的数据。只是当我尝试使用路径变量时才会出现问题并得到 404。
猜你喜欢
  • 2019-11-10
  • 2021-10-03
  • 1970-01-01
  • 2015-04-25
  • 2021-05-28
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2013-07-02
相关资源
最近更新 更多