RestEasy 忽略枚举的 @JsonCreator 方法
RestEasy ignores @JsonCreator method for enum
我在使 RestEasy (3.0.10.Final) 将路径参数解析为枚举值时遇到问题。
具有枚举定义...
package com.stines;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonValue;
public enum MyNumber {
One("number-one"), Two("number-two");
@JsonIgnore private final String text;
@JsonIgnore
private MyNumber(final String text) {
this.text = text;
}
@JsonValue
public String getText() {
return text;
}
@JsonCreator
public static MyNumber byText(final String text) {
for (final MyNumber value : MyNumber.values()) {
if (value.getText().equals(text)) return value;
}
throw new IllegalArgumentException("Unknown number");
}
}
...和端点...
@PUT
@Path("{number}")
void putNumber(
@PathParam("number") MyNumber number
);
...我希望能够达到 PUT http://my-server/number-one
。
虽然我看到了以下内容:
Caused by: java.lang.IllegalArgumentException: No enum constant com.stines.MyNumber.number-one
at java.lang.Enum.valueOf(Enum.java:238)
at com.stines.MyNumber.valueOf(MyNumber.java:7)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.jboss.resteasy.core.StringParameterInjector.extractValue(StringParameterInjector.java:343)
... 34 more
我在这里错过了什么??非常感谢。
问题似乎与 Jackson 无关,因为您映射的是路径参数,而不是有效载荷对象。
根据 the JAX-RS documentation,您可以使用静态方法 valueOf
或 fromString
从字符串构造参数实例。我建议您将 byText
方法重命名为 fromString
,看看会发生什么。
我在使 RestEasy (3.0.10.Final) 将路径参数解析为枚举值时遇到问题。
具有枚举定义...
package com.stines;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonValue;
public enum MyNumber {
One("number-one"), Two("number-two");
@JsonIgnore private final String text;
@JsonIgnore
private MyNumber(final String text) {
this.text = text;
}
@JsonValue
public String getText() {
return text;
}
@JsonCreator
public static MyNumber byText(final String text) {
for (final MyNumber value : MyNumber.values()) {
if (value.getText().equals(text)) return value;
}
throw new IllegalArgumentException("Unknown number");
}
}
...和端点...
@PUT
@Path("{number}")
void putNumber(
@PathParam("number") MyNumber number
);
...我希望能够达到 PUT http://my-server/number-one
。
虽然我看到了以下内容:
Caused by: java.lang.IllegalArgumentException: No enum constant com.stines.MyNumber.number-one
at java.lang.Enum.valueOf(Enum.java:238)
at com.stines.MyNumber.valueOf(MyNumber.java:7)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.jboss.resteasy.core.StringParameterInjector.extractValue(StringParameterInjector.java:343)
... 34 more
我在这里错过了什么??非常感谢。
问题似乎与 Jackson 无关,因为您映射的是路径参数,而不是有效载荷对象。
根据 the JAX-RS documentation,您可以使用静态方法 valueOf
或 fromString
从字符串构造参数实例。我建议您将 byText
方法重命名为 fromString
,看看会发生什么。