我有一个问题,似乎有一个简单的解决方法,但几个月来却一直无法解决:
我正在尝试POST / PUT JSON,并让服务器将它们识别并反序列化为其对应的类。但是服务器无法解析实体,并返回500错误代码。
这与以下事实有关:生成的代码需要接口(Apple
)而不是“普通” Java类(AppleImpl
)。
我之所以知道这一点,是因为如果我在端点中通过实现(Apple
)更改接口(AppleImpl
),则方法会起作用,因为服务器会检测到类型和可以正确地反序列化它,但是每次在RAML中进行更改时,手动更改实现的接口繁琐且容易出错。
在Java后端中,我使用的是实体,接口和端点,所有实体,接口和端点都是使用raml-to-jax-rs v3.0.2生成的。我正在将Maven与Jersey(球衣-bom)v2.27一起使用。
总而言之,我想知道如何在Jersey / JAX-RS 中成功反序列化接口。我是否缺少注释,我的Maven软件包版本是否错误,还是其他原因?
如果有人可以帮助我,我将非常感谢,如有必要,我将提供更多信息。下面是一些示例生成的代码,因此问题更加清楚。
(1/3)示例生成的界面Apple
:
@JsonDeserialize(
as = AppleImpl.class
)
public interface Apple {
@JsonAnyGetter
Map<String, Object> getAdditionalProperties();
@JsonAnySetter
void setAdditionalProperties(String key, Object value);
@JsonProperty("name")
String getName();
@JsonProperty("name")
void setName(String name);
@JsonProperty("values")
List<String> getValues();
@JsonProperty("values")
void setValues(List<String> values);
@JsonProperty("defaultValue")
String getDefaultValue();
@JsonProperty("defaultValue")
void setDefaultValue(String defaultValue);
}
(2/3)示例生成的类AppleImpl
:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"values",
"defaultValue"
})
public class AppleImpl implements Apple {
@NotNull
@JsonProperty("name")
private String name;
@JsonProperty("values")
@NotNull
private List<String> values;
@JsonProperty("defaultValue")
@NotNull
private String defaultValue;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("name")
public String getName() {
return this.name;
}
@JsonProperty("name")
public void setName(String name) {
this.name = name;
}
@JsonProperty("values")
public List<String> getValues() {
return this.values;
}
@JsonProperty("values")
public void setValues(List<String> values) {
this.values = values;
}
@JsonProperty("defaultValue")
public String getDefaultValue() {
return this.defaultValue;
}
@JsonProperty("defaultValue")
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperties(String key, Object value) {
this.additionalProperties.put(key, value);
}
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (this == o) return true;
if (getClass() != o.getClass()) return false;
AppleImpl other = (AppleImpl) o;
return java.util.Objects.equals(this.name, other.name) && java.util.Objects.equals(this.values, other.values) && java.util.Objects.equals(this.defaultValue, other.defaultValue) && java.util.Objects.equals(this.additionalProperties, other.additionalProperties);
}
@Override
public int hashCode() {
return Objects.hash(name,values,defaultValue,additionalProperties);
}
}
(3/3)示例生成的POST端点:
@Override
public PostApplesResponse postApples(String xSessionToken, Apple bean) {
try {
MUser user = AuthUtils.authenticates(xSessionToken);
ModelMapperApple.get().validateBean(bean);
MApple entity = ModelMapperApple.get().b2e(bean);
MApple entityOut = AppleService.getInstance().post(user, entity);
AppleResponse beanOut = ModelMapperApple.get().e2b(entityOut);
return PostApplesResponse.respond201WithApplicationJson(beanOut);
} catch (BadRequestException e) {
CRUDUtils.logException(e);
return PostApplesResponse.respond400WithApplicationJson(ErrorMessageUtils.build(e));
} catch (UnauthorizedException e) {
CRUDUtils.logException(e);
return PostApplesResponse.respond401();
} catch (ConflictException e) {
CRUDUtils.logException(e);
return PostApplesResponse.respond409();
} catch (Exception e) {
CRUDUtils.logException(e);
return PostApplesResponse.respond500();
}
}