Spring @RequestMapping中使用MediaType.APPLICATION_XML报常量错误求助
解决@RequestMapping中MediaType.APPLICATION_XML导致的"Attribute value must be constant"错误
这个问题其实戳中了Java注解的核心要求,以及Spring和JAX-RS两个MediaType类容易混淆的点,我来拆解一下:
为什么会报错?
Java对注解的属性值有严格要求:必须是编译时常量表达式。简单说,就是这个值得在编译阶段就能确定下来,比如基本类型字面量、字符串字面量,或者用这些常量初始化的final变量。
而Spring的org.springframework.http.MediaType里的APPLICATION_XML是一个MediaType类型的对象——哪怕它是final的,也是在运行时通过构造函数创建的引用类型变量,不属于编译时常量,自然不能直接用在注解属性里。
为什么之前的APPLICATION_JSON能正常工作?
大概率是你混淆了两个不同包的MediaType类:
- JAX-RS的
javax.ws.rs.core.MediaType:这个类里的APPLICATION_JSON和APPLICATION_XML都是String类型的静态常量(值分别是"application/json"和"application/xml"),完全符合注解的常量要求,所以之前用的时候没报错。 - Spring的
org.springframework.http.MediaType:它的APPLICATION_JSON是MediaType对象,不是字符串。但Spring贴心地提供了对应的字符串常量,比如APPLICATION_JSON_VALUE,这些才是为注解设计的。
你替换成APPLICATION_XML时,可能不小心切换了导入的包,或者误选了Spring的对象常量,才触发了IDE的错误提示。
怎么解决?
如果用的是Spring的@RequestMapping,直接用Spring提供的带_VALUE后缀的字符串常量就好:
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping(produces = MediaType.APPLICATION_XML_VALUE) public String someMethod() { // ... }
或者你也可以直接写字符串字面量"application/xml",但硬编码不如用常量维护性好。
补充:如果确实两个都是静态块初始化的final变量?
如果你的Spring版本里,APPLICATION_JSON和APPLICATION_XML都是静态块里初始化的MediaType对象,那理论上两个都应该报错。这种情况可能是IDE缓存导致的误判,清理一下IDE缓存,或者直接切换到_VALUE常量就能解决问题。
内容的提问来源于stack exchange,提问作者orbfish
相关产品推荐
相关产品推荐

