我想通过两种不同的@Controller 方法获得相同的 URL 路径句柄,这部分有效。这是我所拥有的:
WebMvc 配置:
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter json = new MappingJackson2HttpMessageConverter();
json.setObjectMapper(objectMapper());
converters.add(json);
VCardMessageConverter vcard = new VCardMessageConverter();
converters.add(vcard);
}
@Override
protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(true)
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("vcf", MediaType.TEXT_VCARD)
;
}
}
控制器:
@RestController
@RequestMapping("test")
class UserProfileController {
@RequestMapping(value="profile", method=RequestMethod.GET, produces=MediaType.TEXT_VCARD_VALUE)
VCard getProfileVCard() {
Profile p = service.getProfile();
VCard v = p.getVCard();
return v;
}
@RequestMapping(value="profile", method=RequestMethod.GET)
Profile getProfile() {
Profile p = service.getProfile();
return p;
}
}
当前行为:
好的:
GET /test/profile
(带Accept=*/*
)调用getProfile()
GET /test/profile
(带Accept=application/json
)调用getProfile()
GET /test/profile.json
(带Accept=*/*
)调用getProfile()
GET /test/profile.json
(带Accept=text/vcard
)返回406 NOT ACCEPTABLE
GET /test/profile
(带Accept=text/vcard
)调用getProfileVCard()
GET /test/profile.vcf
(带Accept=text/vcard
)调用getProfileVCard()
错误的一个:
GET /test/profile.vcf
(with Accept=*/*
) 调用getProfile()
和返回406 NOT ACCEPTABLE
。
为什么会调用错误的方法?我以为我favorPathExtension(true)
在我的配置中进行了设置,以便在设置某些路径扩展时让 Spring 覆盖 Accept-Header?
编辑:
我现在也在favorPathExtension(true).ignoreAcceptHeader(true).favorParameter(true)
我的配置中进行了设置,但它仍然不起作用,profile?format=vcf
甚至profile.vcf?format=vcf
不起作用