Ist @RequestMapping abhängig von der Reihenfolge der Werte?
Diese Frage basiert aufdiese Frag.
Mit Kommentaren hatte ich drei verschiedene Tests geschrieben, um richtig eingestellte Inhaltstypen zu validieren.
@Test
public void testGetImageJpg_ShouldSucceed() throws Exception {
File testImage = new File(TestConstants.TEST_IMAGE_JPG);
byte[] expectedBytes = IOUtils.toByteArray(new FileInputStream(testImage));
when(service.getImage(anyString(), anyString())).thenReturn(testImage);
mockMvc.perform(get("/getImage/id/bla.jpg").sessionAttrs(session))
.andExpect(status().isOk()).andExpect(content().contentType(MediaType.IMAGE_JPEG))
.andExpect(content().bytes(expectedBytes));
}
@Test
public void testGetImagePng_ShouldSucceed() throws Exception {
File testImage = new File(TestConstants.TEST_IMAGE_PNG);
byte[] expectedBytes = IOUtils.toByteArray(new FileInputStream(testImage));
when(service.getImage(anyString(), anyString())).thenReturn(testImage);
mockMvc.perform(get("/getImage/id/bla.png").sessionAttrs(session))
.andExpect(status().isOk()).andExpect(content().contentType(MediaType.IMAGE_PNG))
.andExpect(content().bytes(expectedBytes));
}
@Test
public void testGetImageGif_ShouldSucceed() throws Exception {
File testImage = new File(TestConstants.TEST_IMAGE_GIF);
byte[] expectedBytes = IOUtils.toByteArray(new FileInputStream(testImage));
when(service.getImage(anyString(), anyString())).thenReturn(testImage);
mockMvc.perform(get("/getImage/id/bla.gif").sessionAttrs(session))
.andExpect(status().isOk()).andExpect(content().contentType(MediaType.IMAGE_GIF))
.andExpect(content().bytes(expectedBytes));
}
Dies ist mein Controller, bei dem alle Tests erfolgreich sind:
@RequestMapping(value="/getImage/{id}/{path}", produces = {"image/png","image/jpeg","image/gif"})
@ResponseBody
byte[] getImage(@PathVariable("id") String id,
@PathVariable("path") String path) throws ImageNotFoundException {
File imageFile = service.getImage(id, path);
InputStream in;
try {
in = new FileInputStream(imageFile);
return IOUtils.toByteArray(in);
} catch (IOException e) {
throw new ImageNotFoundException();
}
}
Aber wenn ich die Reihenfolge ändere, wird der Wert zu
produces = {"image/jpeg","image/png","image/gif"}
Der Test für PNG schlägt fehl:
java.lang.AssertionError: Content type expected:<image/png> but was:<image/jpeg>
Im wenig verwirrt, dass das Ändern der Reihenfolge der produzierten Werte zu unterschiedlichen Ergebnissen führt.
Hat jemand dies bemerkt, ist es ein Fehler oder habe ich etwas verpasst?