簡體   English   中英

正在獲取406找不到可接受的表示形式/ Spring JSON Test。 如何在測試中忽略.htm擴展名?

[英]Getting 406 Could not find acceptable representation /Spring JSON Test. How to ignore .htm extension in tests?

控制器需要對所有處理程序(包括JSON REST端點)使用.htm擴展名。 我應該如何測試REST端點?

問題:我無法禁用后綴解釋,並且收到406“找不到可接受的表示形式”

嘗試過的嘗試:我檢查了與406相關的stackoverflow帖子,但找不到與在測試中使用“ htm”后綴的情況相關的帖子。 當您從Controller和Test中刪除“ .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();
    }

    @Test
    public void shouldPassChangePasswordBean() throws Exception {
        mvc.perform(post("/changePassword.htm")
                .accept("*/*")
                .param("username", "example")
                .param("password", "abcdef")                
                )
            .andExpect(status().isOk()); // Test produces 406 instead of 200
    }
}

任何想法?

在較新版本的Spring(我認為4+)中,mime類型首先從后綴確定。

因此,如果您使用.htm后綴,則即使您不願意,Spring也會默認生成HTML。

一種繞過此方法的方法是使用重寫URL的過濾器。 例如, 曲棍球URL重寫器過濾器

這樣,您可以設置一些規則,例如:

/my/page/that/return/json.htm/my/page/that/return/json以便Spring可以根據Accept標頭生成數據。

在Spring 5中,嘗試將Web服務的URL更改為.json! 那是正確的解決方法。 此處的詳細信息http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM