Я использую GWT со следующими jar-файлами: 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.jar
Представление класса 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;
}}
Поле 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; }}
Код для отправки его на отдых 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);
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда я получаю запрос PUT на сервере json, добавляется один дополнительный параметр 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, когда он не отправляется через клиента.