powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / GXT 3 Dynamic Grid with Dynamic Column Model
23 сообщений из 23, страница 1 из 1
GXT 3 Dynamic Grid with Dynamic Column Model
    #39073126
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день

Продолжаю изучать "новые" для меня возможности в GXT (GWT)

сейчас появились несколько вопросов :

Проект пример по ссылке

https://github.com/isalnikov/GWTPortal.git

и так что есть :

интерфейс в котором я отображаю дерево таблиц проаннотированных своей аннотацией @PortalTable
( список получаю через ru.portal.controllers.RestController .tables() )

что хочу : по клику на имя таблицы в дереве (tableTreeView ) Хочу отображать ее содержимое в виде таблицы :) (tableGridView)

Нашел что то похожее , https://www.sencha.com/forum/showthread.php?276826-GXT-3-Dynamic-Grid-with-Dynamic-Column-Model-and-Custom-ValueProvider-WORKING-100

но не могу понять как это реализовать без RPCService а через обычный REST JSON

через RequestBuilder .

Саму ColumnModel планирую получать ведя аннотацию @PortalColumn - которую буду ставить над полями , которые я хочу отобразить в админке . Сейчас же хочется получать все колонки и все данные таблицы ... как есть .

еще вопросы :
автор2) объясните мне популярно как сейчас делать такой финт - если мы что-то меняем (жмем например на ноду в дереве ... то по этому событию - автоматически перестраивается и перегружается таблица )

каким образом связать в одном классе два виджета?
class AdminForm ( который содержит класс дерево и класс таблица) и как или черезчто связать и перебросить сообщение от дерева в таблицу ?


автор3) вопрос о месиве из интерфейсов и джеренриков : объясните популярно

вот это interface TableAutoBeanFactory extends AutoBeanFactory / зачем он нужен и какие в нем методы ?

зачем мы создаем interface RecordResult и при этом на сервере объект должен начинаться с {records : []}
почему нельзя сразу передать массив (зачем его нужно завернуть в { } и дать ключ records)????

автор3) как я могу создавать объекты на стороне сервера автоматически? не руками через JSONObject

Я пробовал делать через Gson - но !!! клиентская честь ругается - т.к . все поля получаются экранированные \"

т.е автоматическая генерация через Gson или через rest com.fasterxml.jackson.core ( когда сразу контроллер возвращает коллекцию объектов в виде json ) в данном подходе не применима???


автор4) как мне использовать возможности самого спринга
к примеру я хочу вызвать метода с классом org.springframework.data.domain interface Pageable для постраничного выводы данных... как мне создать такой объект через GXT?

( раньше в RPC можно было указывать фильты и где сортировать данные и передавать этот объект на сервер )
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39073433
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,


Про AutoBean, в TableAutoBeanFactory определяешь методы которые возвращают AutoBean<MyClass>, по сути указка компилятору создать кучу кода на основе твоего кода который будет отвечает за json<->MyClass(не массив ,как ты хочешь)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface RecordResult {
  List<String> getRecords();
  void setRecords(List<String> l);
}

interface TableAutoBeanFactory extends AutoBeanFactory {
   AutoBean<RecordResult > recordResult ();
}

TableAutoBeanFactory tabf=GWT.create(TableAutoBeanFactory.class);
AutoBean<RecordResult> abrr= AutoBeanCodex.decode(tabf, RecordResult.class, "{records:[\"d\",\"f\"]}");
RecordResult rr = abrr.as();
rr.getRecords();-->"d","f"
или обратно
AutoBean<RecordResult > abrr=tabf.recordResult();
abrr.as().setRecords(Arrays.asList("a","d"));
AutoBeanCodex.encode(abrr).getPayload(); --> {records:["a","d"]}




По поводу переброски событий, есть хороший fw MVP4G, там и модульность, и eventbus, и GIN.
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074228
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1,


Про AutoBean, в TableAutoBeanFactory определяешь методы которые возвращают AutoBean<MyClass>, по сути указка компилятору создать кучу кода на основе твоего кода который будет отвечает за json<->MyClass(не массив ,как ты хочешь)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface RecordResult {
  List<String> getRecords();
  void setRecords(List<String> l);
}

interface TableAutoBeanFactory extends AutoBeanFactory {
   AutoBean<RecordResult > recordResult ();
}

TableAutoBeanFactory tabf=GWT.create(TableAutoBeanFactory.class);
AutoBean<RecordResult> abrr= AutoBeanCodex.decode(tabf, RecordResult.class, "{records:[\"d\",\"f\"]}");
RecordResult rr = abrr.as();
rr.getRecords();-->"d","f"
или обратно
AutoBean<RecordResult > abrr=tabf.recordResult();
abrr.as().setRecords(Arrays.asList("a","d"));
AutoBeanCodex.encode(abrr).getPayload(); --> {records:["a","d"]}




По поводу переброски событий, есть хороший fw MVP4G, там и модульность, и eventbus, и GIN.

Спасибо!

я тут нашел статью аж за 2008 год... https://technophiliac.wordpress.com/tag/controller/

переделал все через spring javaconfig - и все заработало на RPC вызовах ....

еще раз оценил RPC + DTO vs REST JSON + DTO
и понял что проще добавить один слой на сервере для преобразования в java dto (pojo) компоненты и отправлять их через RPC на клиента (со всеми плюсами этой технологии)

чем городить огород из rest сервисов , кучи интерфейсов и AutoBeanFactory....

может я и не прав ... но пока RPC + DTO смотрится намного привлекательнее ...
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074656
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс ! схватил ошибку

Вопрос а как сам GXT объясняет GWT что у него есть свои классы???


Потому что при вызове метода processCall в классе как описано в статье

с параметрами содержащими PagingLoadConfigBean

получаю

авторex = (com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException) com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: Type 'com.sencha.gxt.data.shared.loader.PagingLoadConfigBean' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer. For security purposes, this type will not be deserialized.



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public class GwtRpcController extends RemoteServiceServlet implements Controller, ServletContextAware {

    private ServletContext servletContext;

    private RemoteService remoteService;

    private Class remoteServiceClass;

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        super.doPost(request, response);
        return null;
    }

    @Override
    public String processCall(String payload) throws SerializationException {
        try {
            
            PortalLegacySerializationPolicy legacySerializationPolicy = new PortalLegacySerializationPolicy(); 
            RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass);
            // delegate work to the spring injected service
            
            
            return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters() , legacySerializationPolicy);
        } catch (IncompatibleRemoteServiceException ex) {
            getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);
            return RPC.encodeResponseForFailure(null, ex);
        }
    }

    @Override
    public ServletContext getServletContext() {
        return servletContext;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public void setRemoteService(RemoteService remoteService) {
        this.remoteService = remoteService;
        this.remoteServiceClass = this.remoteService.getClass();
    }

}



payload = (java.lang.String) 7|0|9| http://localhost:8080/application/|CDBF64E989C100D38F983FBC449E1AA8|ru.portal.gwt.gwtportal.client.GWTService|fetchTableOrViewData|com.sencha.gxt.data.shared.loader.PagingLoadConfig|java.lang.String/2004016611|com.sencha.gxt.data.shared.loader.PagingLoadConfigBean/38458988|java.util.ArrayList/4159755760|Users|1|2|3|4|2|5|6|7|50|0|8|0|9|
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074762
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Вот такой вызов:
Код: java
1.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass); 


заставляет использовать LegacySerializationPolicy(почитайте), для которого необходимо чтобы классы наследовали com.google.gwt.user.client.rpc.IsSerializable, а com.sencha.gxt.data.shared.loader.PagingLoadConfigBean наследует java.io.Serializable.
Попробуйте заменить на
Код: java
1.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this);


Ну а дальше наверное упадет на клиенте, т.к. уже клиент не сможет deserialized
Код: java
1.
return RPC.invokeAndEncodeResponse(...)


использует PortalLegacySerializationPolicy, возможно неизвестную клиенту.
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074781
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1,

Вот такой вызов:
Код: java
1.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass); 


заставляет использовать LegacySerializationPolicy(почитайте), для которого необходимо чтобы классы наследовали com.google.gwt.user.client.rpc.IsSerializable, а com.sencha.gxt.data.shared.loader.PagingLoadConfigBean наследует java.io.Serializable.
Попробуйте заменить на
Код: java
1.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this);


Ну а дальше наверное упадет на клиенте, т.к. уже клиент не сможет deserialized
Код: java
1.
return RPC.invokeAndEncodeResponse(...)


использует PortalLegacySerializationPolicy, возможно неизвестную клиенту.

тут описано тоже самое ...

https://www.sencha.com/forum/showthread.php?90592-Paging-Grid-Serialization-with-BasePagingLoadConfig-object

но мне такое решение не помогло ...

:(

PortalLegacySerializationPolicy - shouldDeserializeFields

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class PortalLegacySerializationPolicy extends SerializationPolicy implements TypeNameObfuscator {

    LegacySerializationPolicy legacy = LegacySerializationPolicy.getInstance();

    @Override
    public boolean shouldDeserializeFields(Class<?> clazz) {
        if (Serializable.class.isAssignableFrom(clazz)) {
            return true;
        }
        return legacy.shouldDeserializeFields(clazz);
    }

    @Override
    public boolean shouldSerializeFields(Class<?> clazz) {
       return legacy.shouldSerializeFields(clazz);
    }

    @Override
    public void validateDeserialize(Class<?> clazz) throws SerializationException {
        legacy.validateDeserialize(clazz);
    }

    @Override
    public void validateSerialize(Class<?> clazz) throws SerializationException {
        legacy.validateSerialize(clazz);
    }

    @Override
    public String getClassNameForTypeId(String id) throws SerializationException {
        return legacy.getClassNameForTypeId(id);
    }

    @Override
    public String getTypeIdForClass(Class<?> clazz) throws SerializationException {
        return legacy.getTypeIdForClass(clazz);
    }

}



Ну а дальше наверное упадет на клиенте, т.к. уже клиент не сможет deserialized


а что делать ??то ? одно починил - другое сломалось ...

а как же оно работает по умолчанию?

ведь работает и не ругается?
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074783
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Вы хотите отказаться от файлов XXXXXXX.gwt.rpc, и PortalLegacySerializationPolicy переопределяет isInstantiable, где проверяется IsSerializable.class.isAssignableFrom(clazz)=>Serializable.class.isAssignableFrom(clazz) то можно
Код: java
1.
2.
3.
4.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, new  SerializationPolicyProvider {
  SerializationPolicy getSerializationPolicy(String moduleBaseURL,String serializationPolicyStrongName){
     return legacySerializationPolicy;
  })

;
и тогда можно не наследовать com.google.gwt.user.client.rpc.IsSerializable, а только Serializable. Но зачем, когда есть стандартная реализация с XXXXXXX.gwt.rpc файлами?
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074788
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь хочу именно использовать spring javaconfig + GXT + GWT RPC со всеми плюшками типа FilterPagingLoadConfig итд

и когда мы честно прописываем все в web.xml - это рабоатет ...все примеры на этом основаны ...но стоило ввести GwtRpcController

и все поломалось ...
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074796
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDЕсли Вы хотите отказаться от файлов XXXXXXX.gwt.rpc, и PortalLegacySerializationPolicy переопределяет isInstantiable, где проверяется IsSerializable.class.isAssignableFrom(clazz)=>Serializable.class.isAssignableFrom(clazz) то можно
Код: java
1.
2.
3.
4.
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, new  SerializationPolicyProvider {
  SerializationPolicy getSerializationPolicy(String moduleBaseURL,String serializationPolicyStrongName){
     return legacySerializationPolicy;
  })

;
и тогда можно не наследовать com.google.gwt.user.client.rpc.IsSerializable, а только Serializable. Но зачем, когда есть стандартная реализация с XXXXXXX.gwt.rpc файлами?

ничего не понял ??? я не хочу отказываться от стандартной реализации ... я пытаюсь побороть ошибку , которая возникает ...:(
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074809
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1
ничего не понял ??? я не хочу отказываться от стандартной реализации ... я пытаюсь побороть ошибку , которая возникает ...:(

хорошо, тогда так,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class GwtRpcController extends RemoteServiceServlet implements Controller, ServletContextAware {

    private ServletContext servletContext;

    private RemoteService remoteService;

    private Class remoteServiceClass;

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        super.doPost(request, response);
        return null;
    }
  
    @Override
    public ServletContext getServletContext() {
        return servletContext;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public void setRemoteService(RemoteService remoteService) {
        Field fDelegate = myClass.getClass().getDeclaredField("delegate");
        fDelegate.setAccessible(true);
        fDelegate.set(this,remoteService); 
    }

}
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074821
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1ничего не понял ??? я не хочу отказываться от стандартной реализации ... я пытаюсь побороть ошибку , которая возникает ...:(



хорошо, тогда так,
[/src]

а что дает?

Код: java
1.
2.
3.
4.
5.
    public void setRemoteService(RemoteService remoteService) {
        Field fDelegate = myClass.getClass().getDeclaredField("delegate");
        fDelegate.setAccessible(true);
        fDelegate.set(this,remoteService); 
    }



а если так???

onAfterRequestDeserialized(rpcRequest);

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
public class GwtRpcController extends RemoteServiceServlet implements Controller, ServletContextAware {

    private ServletContext servletContext;

    private RemoteService remoteService;

    private Class remoteServiceClass;

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        super.doPost(request, response);
        return null;
    }

    @Override
    public String processCall(String payload) throws SerializationException {
        try {
            RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass , this);
            // delegate work to the spring injected service
            onAfterRequestDeserialized(rpcRequest);
            return  RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters() ,rpcRequest.getSerializationPolicy());
        } catch (IncompatibleRemoteServiceException ex) {
            getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);
            return RPC.encodeResponseForFailure(null, ex);
        }
    }

    @Override
    public ServletContext getServletContext() {
        return servletContext;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public void setRemoteService(RemoteService remoteService) {
        this.remoteService = remoteService;
        this.remoteServiceClass = this.remoteService.getClass();
    }
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074833
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Это дает то, что не надо переписывать processCall, если нужно // delegate work to the spring injected service , переопределите onAfterRequestDeserialized(rpcRequest).
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074841
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1,

Это дает то, что не надо переписывать processCall, если нужно // delegate work to the spring injected service , переопределите onAfterRequestDeserialized(rpcRequest).

а как?

совсем запутался что то ...


вроде идея простая :

взять и замапить все вызовы на урл спринга вида /**/rpc/gwt/ чтобы не указывать этот сервлет в мапинге web.xml

потом взять то что пришло от клиента - а пришел свой формат в payload
проанализировать его - выташить что него какой методв в каком интерфейсе вызвать , с какими параметрами ...

вызвать , все это , ответ завернуть в такую же хрень и отправить на клиента ...

и ведь работает и отлично же ... раньше ...

и не нужно писать кучу ненужного кода по маршалингу json <-> pojo java/// итд
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39074848
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

А разве мой вариант с "delegate" не работает? Должно работать.
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39075600
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1,

А разве мой вариант с "delegate" не работает? Должно работать.

0FD большое спасибо за советы .

помогите - еще разок :) остался последний шаг:
1) я все перевел на GWT RPC
https://github.com/isalnikov/GWTPortal.git
2) таблицы (имена таблиц и колонок ) грузятся в дерево
3) выбрав нужную таблицу в дереве загружается ее список колонок и отображается
https://www.sencha.com/forum/showthread.php?276826-GXT-3-Dynamic-Grid-with-Dynamic-Column-Model-and-Custom-ValueProvider-WORKING-100

4) но не могу понять две вещи :
как загрузить данные в таблицу????

4.1)
что это за часть в коде :

YourCustomerClass

ru.portal.gwt.gwtportal.client.DynamicGrid
и
ru.portal.gwt.gwtportal.client.DynamicGridView

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        ListStore<M> store = new ListStore<M>(new ModelKeyProvider<M>() {
            @Override
            public String getKey(M item) {
                GWT.log(item.toString());
//                if (item instanceof <YourCustomerClass>) {
//                    return ((YourCustomerClass) item).getId();
//                }
                return null;
            }
        });




4.2) и почему там везде тип M = Map<String,String> ???

4.3) как описать метода на стороне сервера fetchTableOrViewData ? чтобы он для конкретной таблицы вернул все значения ? в каком виде все это должно вернуться?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Override
    public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName) {
        //List<? extends SortInfo> sortList = config.getSortInfo();
        //Sort sort = new Sort(Sort.Direction.DESC, "login");
        int page = (config.getLimit() != 0 && config.getOffset() > 0) ? (config.getOffset() / config.getLimit()) : 0;
        Pageable pageable = new PageRequest(page, config.getLimit()); //TODO sort + page size + тут мощный сb 
        //Page<User> list = userService.findAll(pageable); ???
        Map<String, String> map = new HashMap<>();
        return new PagingLoadResultBean(list.getContent(), (int) list.getTotalElements(), config.getOffset());
    }




PS

чтобы все это "добить" хорошо бы добавить в setEastWidget() - динамически создаваемый editor- на основе данных таблицы (выбор строки таблицы - получение записи и ее редактирование).
доступные для редактирования поля (колонки) и их типы ?!! и сохранять изменения в БД.

тогда цикл будет завершен полностью...
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39075818
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP

получить все по типу можно в самом простом случае так через CriteriaBuilder :
( почему то не понимает // cq.select(root); ???? )
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
package ru.portal.services;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.EntityType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.portal.interfaces.PortalTable;

@Service
@Transactional
public class TableServiceImpl implements TableService {

   @PersistenceContext
    private EntityManager em;

   @Override
    public Page<List<String>> findAll(String tableOrViewName, Pageable pageable) {
        List<List<String>> result = new ArrayList<>();
        EntityType<?> type = null;
        Set<EntityType<?>> set = em.getEntityManagerFactory().getMetamodel().getEntities();
        for (EntityType<?> entityType : set) {
            if (entityType.getBindableJavaType().getAnnotation(PortalTable.class) != null) {
                if (entityType.getBindableJavaType().getName().equals(tableOrViewName)) {
                    type = entityType;
                    break;
                }
            }
        }

        if (type != null) {
            Class<?> bindableJavaType = type.getBindableJavaType();
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<?> cq = cb.createQuery(bindableJavaType);
            Root<?> root = cq.from(bindableJavaType);
//          cq.select(root);
            TypedQuery<?> q = em.createQuery(cq);
            List<?> all = q.getResultList();

        }

        //TODO 
        int total = 0;
        PageImpl<List<String>> list = new PageImpl<>(result, pageable, total);
        return list;
    }

}




вопрос как потом это отобразить для клиента???
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39075850
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Разве компилятор не ругается на это ???:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName) {
        //List<? extends SortInfo> sortList = config.getSortInfo();
        //Sort sort = new Sort(Sort.Direction.DESC, "login");
        int page = (config.getLimit() != 0 && config.getOffset() > 0) ? (config.getOffset() / config.getLimit()) : 0;
        Pageable pageable = new PageRequest(page, config.getLimit()); //TODO sort + page size + тут мощный сb 
        Page<User> list = userService.findAll(pageable); 
        Map<String, String> map = new HashMap<>();
        return new PagingLoadResultBean(list.getContent(), (int) list.getTotalElements(), config.getOffset()); 
        // list.getContent() -> List<User> -> PagingLoadResultBean(List<Data> list, int totalLength, int offset) -> PagingLoadResultBean<User> -> PagingLoadResult<User>
}


как получается User -> Map<String, String>?
И очень много вопросов, вы что-то пишете а потом спрашиваете зачем это!
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39075890
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD

спасибо вам за помощь и дискуссию !

остался один вопрос : как правильно сформировать данные в методе

public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName)

чтобы они корректно отобразились на клиенте ...


и так :

я написал метод который возвращает список некоторых объектов с поддержкой постраничного вывода через CriteriaBuilder

вот так

но я не понимаю что он должен возвращать??? чтобы это можно было засунуть в PagingLoadResult<Map<String, String>>

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
    @Override
    public Page<List<String>> findAll(String tableOrViewName, Pageable pageable) {
        List<List<String>> result = new ArrayList<>();
        EntityType<?> type = null;
        Set<EntityType<?>> set = em.getEntityManagerFactory().getMetamodel().getEntities();
        for (EntityType<?> entityType : set) {
            if (entityType.getBindableJavaType().getAnnotation(PortalTable.class) != null) {
                if (entityType.getBindableJavaType().getName().equals(tableOrViewName)) {
                    type = entityType;
                    break;
                }
            }
        }

        Long totalRows = 0L;
        
        if (type != null) {
            Class<?> bindableJavaType = type.getBindableJavaType();
          
            //count
            CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
            CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
            countQuery.select(criteriaBuilder.count(countQuery.from(bindableJavaType)));
            totalRows =  em.createQuery(countQuery).getSingleResult();

            //select
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<?> cq = cb.createQuery(bindableJavaType);
            Root<?> root = cq.from(bindableJavaType);
//          cq.select(root);
            if(pageable == null){
                pageable = new PageRequest(0, 50);
            }
            
            TypedQuery<?> query = em.createQuery(cq);
            
            query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
            query.setMaxResults(pageable.getPageSize());
            List<?> all = query.getResultList();
            
     

        }

        
        PageImpl<List<String>> list = new PageImpl<>(result, pageable, totalRows);
        
        return list;
    }




что тут нужно написать ???

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Override
    public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName) {
        //List<? extends SortInfo> sortList = config.getSortInfo();
        //Sort sort = new Sort(Sort.Direction.DESC, "login");
        int page = (config.getLimit() != 0 && config.getOffset() > 0) ? (config.getOffset() / config.getLimit()) : 0;
        Pageable pageable = new PageRequest(page, config.getLimit()); //TODO sort + page size + тут мощный сb 
        Page<List<String>> result = tableService.findAll(tableOrViewName , pageable);
        result.getContent();
        return new PagingLoadResultBean(null, (int) result.getTotalElements(), config.getOffset());
    }
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39076462
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

вот код который должен работать , но получаю ошибку :
findAll
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
@Override
    public Page<Map<String, String>> findAll(String tableOrViewName, Pageable pageable) {
       
        List<Map<String, String>> result = new ArrayList<>();
        
        EntityType<?> type = null;
        Set<EntityType<?>> set = em.getEntityManagerFactory().getMetamodel().getEntities();
        for (EntityType<?> entityType : set) {
            if (entityType.getBindableJavaType().getAnnotation(PortalTable.class) != null) {
                if (entityType.getBindableJavaType().getName().equals(tableOrViewName)) {
                    type = entityType;
                    break;
                }
            }
        }

        Long totalRows = 0L;
        
        if (type != null) {
            Class<?> bindableJavaType = type.getBindableJavaType();
          
            //count
            CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
            CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
            countQuery.select(criteriaBuilder.count(countQuery.from(bindableJavaType)));
            totalRows =  em.createQuery(countQuery).getSingleResult();

            //select
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<?> cq = cb.createQuery(bindableJavaType);
            Root<?> root = cq.from(bindableJavaType);
//          cq.select(root);
            if(pageable == null){
                pageable = new PageRequest(0, 50);
            }
            
            TypedQuery<?> query = em.createQuery(cq);
            
            query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());
            query.setMaxResults(pageable.getPageSize());
            List<?> all = query.getResultList();
            
            
            List<String> columns = getTableOrViewMetaData(tableOrViewName);
            
           
            
            for (Object object : all) {
                
                HashMap<String, String> res = new HashMap<>(columns.size());
                Class<? extends Object> clazz = object.getClass();
                for (String fieldName : columns) {
                    try {
                        Field field = clazz.getDeclaredField(fieldName);
                        field.setAccessible(true);
                        Object fieldValue =  field.get(object);
                        res.put(fieldName, fieldValue.toString());
                        //TODO cast data integer long etc
                    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
                        Logger.getLogger(TableServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                result.add(res);
            }
        }
        
        PageImpl<Map<String, String>> list = new PageImpl<>(result, pageable, totalRows);
        return list;
    }




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Override
    public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName) {
        //List<? extends SortInfo> sortList = config.getSortInfo();
        //Sort sort = new Sort(Sort.Direction.DESC, "login");
        int page = (config.getLimit() != 0 && config.getOffset() > 0) ? (config.getOffset() / config.getLimit()) : 0;
        Pageable pageable = new PageRequest(page, config.getLimit()); //TODO sort + page size + тут мощный сb 
        Page<Map<String, String>> result = tableService.findAll(tableOrViewName , pageable);
        result.getContent();
        return new PagingLoadResultBean(result.getContent(), (int) result.getTotalElements(), config.getOffset());
    }



ошибка :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
2015-10-14 12:37:40.699:WARN:/:qtp142993407-32: Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'java.util.Collections$UnmodifiableRandomAccessList' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [{rolename=ROLE_ADMIN, id=1}, {rolename=ROLE_USER, id=2}]
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:667)
	at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:130)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:587)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:758)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:797)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:770)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:797)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:669)
	at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:130)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:587)
	at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:631)
	at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:497)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:589)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
	at ru.portal.gwt.gwtportal.server.GwtRpcController.processCall(GwtRpcController.java:48)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
	at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
	at ru.portal.gwt.gwtportal.server.GwtRpcController.handleRequest(GwtRpcController.java:38)
	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:816)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1114)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1048)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
	at org.eclipse.jetty.server.Server.handle(Server.java:517)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
	at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
	at java.lang.Thread.run(Thread.java:745)
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39076753
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если прописать все в web.xml - ошибок нет .
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39076777
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Если прописать все в web.xml - ошибок нет .
Вот это и странно.

Код: java
1.
return new PagingLoadResultBean(new ArrayList(result.getContent()), (int) result.getTotalElements(), config.getOffset());
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39076817
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAtum1Если прописать все в web.xml - ошибок нет .
Вот это и странно.

Код: java
1.
return new PagingLoadResultBean(new ArrayList(result.getContent()), (int) result.getTotalElements(), config.getOffset());




https://github.com/isalnikov/GWTPortal.git

откатил все на javaconfig - все проблема в том что нужно явно указать чем будет реализован map

HashMap

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Override
    public PagingLoadResult<Map<String, String>> fetchTableOrViewData(PagingLoadConfig config, String tableOrViewName) {
        int limit = 50;
        int page = 0;
        int offset = 0;
        if (config != null) {
            page = (config.getLimit() != 0 && config.getOffset() > 0) ? (config.getOffset() / config.getLimit()) : 0;
            limit = config.getLimit();
            offset = config.getOffset();
        }

        Pageable pageable = new PageRequest(page, limit); //TODO sort + page size + тут мощный сb 
        Page<HashMap<String, String>> result = tableService.findAll(tableOrViewName, pageable);
        ArrayList<HashMap<String,String>> res = new ArrayList<>( result.getContent());
        return new PagingLoadResultBean(res, (int) result.getTotalElements(), offset);
    }




так же переписал метод getKey in DynamicGrid:
вместо
// if (item instanceof <YourCustomerClass>) {
// return ((YourCustomerClass) item).getId();
// }

приходится разбирать строку - и вытаскивать из нее id для таблицы ...
Вроде ошибок нет , данные приходят на клиента ....НО
в таблице не отображаются ...


и почему- то идет двойной вызов
(видимо где то идет вызов
public void refreshDynamicGrid() {
this.loader.load();
}
)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        ListStore<M> store = new ListStore<M>(new ModelKeyProvider<M>() {
            @Override
            public String getKey(M item) {
                GWT.log(item.toString());
                String id = null;
                if (item != null) {
                    // {rolename=ROLE_USER, id=2}
                    String[] arr = item.toString().replaceAll("\\{", "").replaceAll("\\}", "").split(",");
                    for (String string : arr) {
                        String[] sarr = string.split("=");
                        if (sarr[0].replaceAll(" ", "").equals("id")) {
                            id = sarr[1];
                            break;
                        }
                    }
                }
//                if (item instanceof <YourCustomerClass>) {
//                    return ((YourCustomerClass) item).getId();
//                }
                GWT.log(id);
                return id;
            }
        });
...
Рейтинг: 0 / 0
GXT 3 Dynamic Grid with Dynamic Column Model
    #39077282
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все заработало ...

ошибка была в VerticalLayoutData он просто был свернут в 1 пиксель и не отображал таблицу с данными .
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / GXT 3 Dynamic Grid with Dynamic Column Model
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]