1

我想通过两种不同的@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不起作用

4

0 回答 0