【问题标题】:@RequestMapping java.lang.AssertionError: Status Expected :200 Actual :404@RequestMapping java.lang.AssertionError:预期状态:200 实际:404
【发布时间】:2017-12-25 21:00:32
【问题描述】:

在类外使用@RequestMapping注解的断言错误

我收到此错误消息:

 java.lang.AssertionError: Status 
    Expected :200
    Actual   :404

我的控制器是这样的

        @Service
        @RestController
        @RequestMapping("/execute/files")
        @ResponseBody
        public class ControllerFiles {
            @Autowired
            @Qualifier("fileRunner")
            ProcessRunnerInterface processRunnerInterfaceFiles;  

            public InputState executeRestFile(@RequestParam String name) throws ExecutionFailedException, URISyntaxException {
               ///code///    
            }
            public List<String>....{
             ///code///
            }
        }

我的测试

  @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class ControllerFilesTest {

        @Autowired
        private MockMvc mockMvc;
        @Autowired
        ControllerFiles controllerFiles;

        @Test
        public void testSpringMvcGetFiles() throws Exception {

            this.mockMvc.perform(get("/execute/files").param("name", "Spring Community Files"))
                    .andDo(print()).andExpect(status().isOk());
        }
}

但是当我有这样的代码时,测试工作正常!

            @Service
            @RestController
            public class ControllerFiles {
                @Autowired
                @Qualifier("fileRunner")
                ProcessRunnerInterface processRunnerInterfaceFiles;

                @RequestMapping("/execute/files")
                @ResponseBody
                public InputState executeRestFile(@RequestParam String name) throws ExecutionFailedException, URISyntaxException {
                  ///code///        
                }  
               public List<String>....{  
                  ///code/// 
               }
}

有什么想法吗?

【问题讨论】:

  • 首先删除@Service(因为它是@RestController而不是@Service)并删除@ResponseBody,因为@RestController已经暗示了这一点。
  • @M.Deinum 还是一样,还有其他建议吗?

标签: java spring spring-boot junit mockmvc


【解决方案1】:

如果您希望将 RestController 中的方法作为请求资源提取,则需要将它们标记为 @RequestMapping。如果您想像在第一个 RestController 中一样将基本请求映射保持在控制器级别,那么您需要执行以下操作:

@RestController
@RequestMapping("my/path")
public class MyController {

   @RequestMapping("/")
   public InputState myMethod() {
     ...
   }
}

【讨论】:

    【解决方案2】:

    正如documentation中所说:

    在上面的例子中,@RequestMapping 用在很多地方。第一种用法是在类型(类)级别上,表示此控制器中的所有处理程序方法都相对于 /appointments 路径。

    所以类级别@RequestMapping 仅表示相对。它不是仅基于公共方法声明实际资源路径。所以你需要像这样注释你的方法:

    @GetMapping
    public InputState executeRestFile(@RequestParam String name) throws Exception {
        // omited
    }
    

    或者像这样:

    @RequestMapping(method = RequestMethod.GET)
    public InputState executeRestFile(@RequestParam String name) throws Exception {
        // omited
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多