首页 > 解决方案 > 通过 JAX-rs 发送时,额外变量被添加到 json 中

问题描述

我正在使用带有以下 jar 的 GWT:jackson-jaxrs-base-2.5.4.jar jackson-databind-2.5.4.jar jackson-annotations-2.5.4.jar jackson-jaxrs-json-provider-2.5.4。罐

UserReporting 类视图如下:

public class UserReportingFilter implements IsSerializable {

public static final String FILTER_ID_KEY = "filter_id";
public static final String USER_ID_KEY = "user_id";
public static final String FILTER_CONTENT_KEY = "filter_content";
public static final String REPORT_VIEW_TYPE = "report_view_type";
public static final String FILTER_NAME_KEY = "filter_name";

@JsonProperty(FILTER_ID_KEY)
private int filterId;

@JsonProperty(USER_ID_KEY)
private int userId;

@JsonProperty(FILTER_CONTENT_KEY)
@JsonDeserialize(using = StringToFilterContentDeserializer.class)
private Map<ReportsFilterName, ReportsFilter> filterContent;

@JsonProperty(REPORT_VIEW_TYPE)
@JsonSerialize(using = ReportViewToStringSerializer.class)
@JsonDeserialize(using = StringToReportViewDeserializer.class)
private ReportView reportViewType;

@JsonProperty(FILTER_NAME_KEY)
private String filterName;

public UserReportingFilter() {
    //no-args serialization constructor
}

public UserReportingFilter(int filterId, int userId, Map<ReportsFilterName, ReportsFilter> filterContent, ReportView reportViewType, String filterName) {
    this.filterId = filterId;
    this.userId = userId;
    this.filterContent = filterContent;
    this.reportViewType = reportViewType;
    this.filterName = filterName;
}}

Field ReportView 是一个枚举。下面是代码:

public enum ReportView implements IsSerializable {
CHANGES("CHANGES", newArrayList(DATE, ID, CHANGE_TYPE, DN, MO_CLASS, STATUS, MODULE_INSTANCE_NAME, MODULE_NAME, ACTIVATION_NUMBER, CHANGESET_ID, OWNER_USER)),
ANALYSIS("ANALYSIS", newArrayList(DATE, ID, SCENARIO, MODULE_INSTANCE_NAME, CHANGE_OBJECT, MODULE_NAME, OWNER_USER, STATUS));

private final List<ReportsFilterName> supportedFilters;
private final String reportViewName;

ReportView(String reportViewName, List<ReportsFilterName> supportedFilters) {
    this.reportViewName = reportViewName;
    this.supportedFilters = supportedFilters;
}

public boolean isSupported(ReportsFilterName filter) {
    return supportedFilters.contains(filter);
}

public List<ReportsFilterName> getSupportedFilters() {
    return supportedFilters;
}

public String getReportViewName() { return reportViewName; }}

将其发送到 rest API 的代码:

public long update(T to) {
    Client client = makeClient();
    try {
        return invocationBuilder(client).put(Entity.json(to), Long.class);
    } finally {
        client.close();
    }}

调用更新的代码如下:

public void storeFilter(UserReportingFilter filter, ReportView reportView) {
    Optional<UserReportingFilter> filterToUpdate = getExistingUserFilter(filter);
    int filterId = filterToUpdate.get().getFilterId();
    filter.setFilterId(filterId);
    update(filter);}


private Invocation.Builder invocationBuilder(Client client) {
    WebTarget target = client.target(baseUri);
    return target.request(MediaType.APPLICATION_JSON_TYPE);
}

我面临的问题是当我在服务器 json 中收到 PUT 请求时,添加了一个额外的参数 u'viewType 。

    { 
      u'user_id': 1, 
      u'filter_id': 0, 
      u'report_view_type': u'CHANGES', 
      u'filter_name': u'CELL', 
      u'viewType': u'CHANGES', 
      u'filter_content': {
        u'DATE': {
          u'specific': False,
          u'startDate': 1544518015529, 
          u'endDate': 1544604415529, 
          u'name': u'DATE',
          u'timeUnit': u'HOUR'
        }
      }
    }

这导致一些服务器逻辑失败,我不确定为什么这个额外的参数被添加到 json ,当它不是通过客户端发送时。

标签: javarestserializationgwt

解决方案


推荐阅读