球衣不适用于POST,PUT

时间:2018-07-31 14:12:22

标签: java jersey glassfish jax-rs

我有一个问题,似乎有一个简单的解决方法,但几个月来却一直无法解决:

我正在尝试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();
  }
}

0 个答案:

没有答案