नियंत्रक को JSON REST एंडपॉइंट सहित सभी हैंडलर के लिए .htm एक्सटेंशन का उपयोग करने की आवश्यकता है। मुझे आरईएसटी एंडपॉइंट्स के लिए कैसे परीक्षण करना चाहिए?

समस्या: मैं प्रत्यय व्याख्या को अक्षम नहीं कर सकता और मुझे 406 मिल रहे हैं "स्वीकार्य प्रतिनिधित्व नहीं मिल सका"

प्रयास किए गए प्रयास: मैंने 406 से संबंधित स्टैक ओवरफ्लो पर पोस्ट की समीक्षा की, लेकिन उस मामले में प्रासंगिक एक नहीं मिला जहां परीक्षणों में 'एचटीएम' प्रत्यय का उपयोग किया जाता है। जब आप नियंत्रक और परीक्षण दोनों से '.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
    }
}

कोई विचार?

0
Witold Kaczurba 18 जुलाई 2018, 00:45

2 जवाब

स्प्रिंग के नए संस्करण (4+ मुझे लगता है) पर, माइम प्रकार पहले प्रत्यय से निर्धारित होता है।

इसलिए यदि आप .htm प्रत्यय का उपयोग करते हैं, तो स्प्रिंग डिफ़ॉल्ट रूप से HTML उत्पन्न करेगा, भले ही आप न चाहें।

इसे बायपास करने का एक तरीका URL को फिर से लिखने वाले फ़िल्टर का उपयोग करना है। उदाहरण के लिए टकी URL रीराइटर फ़िल्टर

इसके साथ, आप कुछ नियम निर्धारित कर सकते हैं जैसे:

/my/page/that/return/json.htm को /my/page/that/return/json में फिर से लिखा जाता है ताकि स्प्रिंग Accept हेडर के अनुसार डेटा तैयार कर सके।

0
wargre 24 जुलाई 2018, 12:25

स्प्रिंग 5 के साथ, अपनी वेब सेवा के URL को .json में बदलने का प्रयास करें! यह सही फिक्स है। यहां बढ़िया विवरण http://stick2code.blogspot.com/2014/03/solved -orgspringframeworkwebhttpmediaty.html

0
tom 3 नवम्बर 2018, 17:57