java - 通过 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 ,当它不是通过客户端发送时。
解决方案
推荐阅读
- ruby-on-rails - 无法让 Bootstrap 在 Ruby on rails 应用程序中工作
- angular - 打字稿转换为数字有效,但现在不行
- reactjs - 有没有办法使用 api 映射我的城市阵列上的城市并渲染来自阵列上所有城市的信息?
- php - 如何在浏览器中从我的数据库中显示 PDF 文件?
- r - 如何在 R 中的数据框中对不同日期的数据进行不同的标准化?
- firebase - Firebase 数据库:用户是否每次都下载整个数据库?
- c# - c# 带有 mysqldatabase 的应用程序使用大量 ram
- intellij-idea - 如何做箭头和不等于这样
- python - 修复 Pandas 散点矩阵图中的轴比例
- inheritance - 子类中的 Kotlin 单例