控制器需要为所有处理程序使用 .htm 扩展名,包括 JSON REST 端点。我应该如何测试 REST 端点?问题: 我无法禁用后缀解释,并且收到 406“找不到可接受的表示”尝试过的尝试: 我查看了与 406 相关的 stackoverflow 上的帖子,但找不到与在测试中使用“htm”后缀的情况相关的帖子。当您从控制器和测试中删除“.htm”后缀时 - 测试通过。这是带有 /changePassword.htm 端点的控制器:@Controllerpublic class MainController { public static class ResultBean { private final String result; public String getResult() { return result; } public ResultBean(String result) { this.result = result; } } @RequestMapping(value="/changePassword.htm", method= RequestMethod.POST, produces = { "application/json" }) public @ResponseBody ResultBean changePassword ( @RequestParam("username") String username, @RequestParam("password") String password) { return new ResultBean("OK"); }}这是带有配置的测试:@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(classes = { HomeControllerTest.Config.class })public class HomeControllerTest { @InjectMocks private MainController controller = new MainController(); private MockMvc mvc; @Configuration @EnableWebMvc public static class Config extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false) .favorParameter(true) .parameterName("mediaType") .ignoreUnknownPathExtensions(true) .ignoreAcceptHeader(false) .useJaf(false) .defaultContentType(MediaType.APPLICATION_JSON); } @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } } @Before public void setup() { MockitoAnnotations.initMocks(this); mvc = MockMvcBuilders.standaloneSetup(controller) .build(); }任何想法?
2 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
在较新版本的 Spring(我认为是 4+)上,mime 类型首先由后缀确定。
因此,如果您使用.htm
后缀,即使您不想,Spring 也会默认生成 HTML。
绕过这一点的一种方法是使用重写 URL 的过滤器。例如tuckey URL 重写器过滤器
有了这个,您可以设置一些规则,例如:
/my/page/that/return/json.htm
被重写为,/my/page/that/return/json
以便 Spring 可以根据Accept
header生成数据。
添加回答
举报
0/150
提交
取消