Как Чат Gmail в состоянии выполнить запросы Ajax без клиентского взаимодействия?

Начиная с версии 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();

    }
}

Отфильтрованный результат :

enter image description here

59
задан Pablo Fernandez 9 April 2009 в 17:07
поделиться

3 ответа

Эта технология известна как "комета", но также как "серверный толчок", "обратный ajax" и т. Д.

Речь идет о передаче данных с сервера в браузер, поддерживая http-соединение живым. Более подробную информацию можно найти в статье в Википедии ( Английская версия ).

Также вот довольно хорошая презентация с Джо Уокером из DWR, где он рассказывает о комете.

42
ответ дан Jon Skeet 24 November 2019 в 18:33
поделиться

Как вы справедливо заметили, HTTP требует, чтобы данные «извлекались» клиентом. Gmail все еще может «извлекать» данные с сервера, используя таймер для запуска операции HTTP вместо того, чтобы требовать от пользователя что-то щелкнуть. Таким образом, это может показаться автоматическим, но он все еще инициирован клиентом.

8
ответ дан sybreon 24 November 2019 в 18:33
поделиться

Да, кометы верны. Приложения Google Web Toolkit от Райана Дьюсбери объясняет, как создать приложение Instant Messenger на основе комет, в главе 9.

5
ответ дан Pablo Fernandez 24 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: