为了账号安全,请及时绑定邮箱和手机立即绑定

获取 406 找不到可接受的表示/Spring JSON 测试。如何在测试中忽略 .htm 扩展名?

获取 406 找不到可接受的表示/Spring JSON 测试。如何在测试中忽略 .htm 扩展名?

GCT1015 2021-05-31 10:18:03
控制器需要为所有处理程序使用 .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 可以根据Acceptheader生成数据。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信