猿问

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

控制器需要为所有处理程序使用 .htm 扩展名,包括 JSON REST 端点。我应该如何测试 REST 端点?


问题: 我无法禁用后缀解释,并且收到 406“找不到可接受的表示”


尝试过的尝试: 我查看了与 406 相关的 stackoverflow 上的帖子,但找不到与在测试中使用“htm”后缀的情况相关的帖子。当您从控制器和测试中删除“.htm”后缀时 - 测试通过。


这是带有 /changePassword.htm 端点的控制器:


@Controller

public 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();

    }


任何想法?


GCT1015
浏览 147回答 2
2回答

宝慕林4294392

在较新版本的 Spring(我认为是 4+)上,mime 类型首先由后缀确定。因此,如果您使用.htm后缀,即使您不想,Spring 也会默认生成 HTML。绕过这一点的一种方法是使用重写 URL 的过滤器。例如tuckey URL 重写器过滤器有了这个,您可以设置一些规则,例如:/my/page/that/return/json.htm被重写为,/my/page/that/return/json以便 Spring 可以根据Acceptheader生成数据。
随时随地看视频慕课网APP

相关分类

Java
我要回答