Начиная с версии 2.6 у Джексона есть метод setFilterProvider для ObjectMapper. Я не пробовал, но в документации есть описание для этого: https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/ObjectMapper.html#setFilterProvider- com.fasterxml.jackson.databind.ser.FilterProvider- . Вы можете попробовать, я думаю, потому что описание подходит для вашего случая.
Я создал тестовый сервис с Джерси 2.7 и Джексоном 2.9.5. он работает нормально, но вы должны знать некоторые приемы, чтобы запустить его.
В pom.xml добавьте Джерси и Джексона:
org.glassfish.jersey
jersey-bom
${jersey.version}
pom
import
org.glassfish.jersey.containers
jersey-container-servlet-core
org.glassfish.jersey.media
jersey-media-json-jackson
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
2.7
2.9.5
UTF-8
Вы должны определить эту зависимость:
org.glassfish.jersey.media
jersey-media-json-jackson
это обязательно.
В web.xml вы должны сделать ссылку на конфигурацию вашего сервиса:
Jersey Web Application
org.glassfish.jersey.servlet.ServletContainer
org.glassfish.jersey.server.ResourceConfig
com.home.MyApplication
1
MyApplication.java:
package com.home;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;
@ApplicationPath("/webapi")
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(ObjectMapperProvider.class);
register(JacksonFeature.class);
register(MyResource.class);
}
}
С пользовательским ObjectMapperProvider вы должны зарегистрировать JacksonFeature.class, потому что без него Джерси не использует пользовательский ObjectMapperProvider.
ObjectMapperProvider.java:
package com.home;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
@Provider
public class ObjectMapperProvider implements ContextResolver{
final ObjectMapper defaultObjectMapper;
public ObjectMapperProvider() {
defaultObjectMapper = createDefaultMapper();
}
@Override
public ObjectMapper getContext(Class> type) {return defaultObjectMapper;}
public static ObjectMapper createDefaultMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setFilters(new SimpleFilterProvider().addFilter("dataFilter", SimpleBeanPropertyFilter.serializeAllExcept("region", "city")));
return mapper;
}
}
Чтобы определить фильтр, используйте методы setFilters. Этот метод устарел, но библиотека Джерси, которая называется 'jersey-hk2', не знает новый метод 'setFilterProvider' и выдает исключение. При старом методе все работает нормально.
Бизнес-объект с @JsonFilter:
@JsonFilter("dataFilter")
public class SimpleData {
@JsonProperty("name")
String firstName;
@JsonProperty("secondName")
String lastName;
@JsonProperty("country")
String country;
@JsonProperty("region")
String region;
@JsonProperty("city")
String city;
@JsonProperty("genre")
String genre;
public SimpleData() {
this.firstName = "Bryan";
this.lastName = "Adams";
this.country = "Canada";
this.region = "Ontario";
this.city = "Kingston";
this.genre = "Rock";
}
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public String getCountry() { return country; }
public void setCountry(String country) { this.country = country; }
public String getRegion() { return region; }
public void setRegion(String region) { this.region = region; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getGenre() { return genre; }
public void setGenre(String genre) { this.genre = genre; }
}
MyResource.java:
@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public SimpleData getIt() {
return new SimpleData();
}
}
Отфильтрованный результат :
Эта технология известна как "комета", но также как "серверный толчок", "обратный ajax" и т. Д.
Речь идет о передаче данных с сервера в браузер, поддерживая http-соединение живым. Более подробную информацию можно найти в статье в Википедии ( Английская версия ).
Также вот довольно хорошая презентация с Джо Уокером из DWR, где он рассказывает о комете.
Как вы справедливо заметили, HTTP требует, чтобы данные «извлекались» клиентом. Gmail все еще может «извлекать» данные с сервера, используя таймер для запуска операции HTTP вместо того, чтобы требовать от пользователя что-то щелкнуть. Таким образом, это может показаться автоматическим, но он все еще инициирован клиентом.
Да, кометы верны. Приложения Google Web Toolkit от Райана Дьюсбери объясняет, как создать приложение Instant Messenger на основе комет, в главе 9.