복붙노트

[SPRING] Vaadin : 데이터를 변경하기위한 UI 참조 얻기

SPRING

Vaadin : 데이터를 변경하기위한 UI 참조 얻기

Vaadin UI 내부에서 데이터를 변경하고 싶습니다. 변경은 a 나머지 호출에 의해 호출됩니다. 저기, 어떻게 든 그 메서드를 호출하는 UI 클래스에 대한 참조가 필요합니다 '. changeValue (문자열 값).

vaadin-spring-boot-startter 1.0.0을 사용하고 있습니다.

어떻게 든 가능합니까?

수정 : 다른 질문은 지금 : 뷰 내부에서 @Eric이 언급 한 서버 푸시를 수행하려고 했으므로 뷰가 브로드 캐스트 메시지로 업데이트됩니다. 그러나 이것은 작동하지 않습니다 (예외는 없으며, 디버깅 할 것도없고 뷰의 업데이트도 없음). 이것은 내보기에서 무엇입니까 :

@UIScope
@SpringView(name = LoadWebsiteView.VIEW_NAME)
@Push
public class LoadWebsiteView extends VerticalLayout implements View, Broadcaster.BroadcastListener {
...

@Autowired
public LoadWebsiteView(ScraperMainUI scraperMainUi) {
    this.scraperMainUi = scraperMainUi;
    Broadcaster.register(this);
    initControlPane();
}

@Override
public void receiveBroadcast(String message) {
    scraperMainUi.access(new Runnable() {
        @Override
        public void run() {
            urlTxtField.setValue(message);
        }
    });
}

여기 내 restcontroller에서하는 간단한 것들이 있습니다 :

Broadcaster.broadcast(text);

해결법

  1. ==============================

    1.당신이 찾고있는 것은 Vaadin의 Push 기능과 등록 된 "클라이언트"목록에 메시지를 보내는 방법입니다 (이 경우 변경 사항을 알 필요가있는 Vaadin UI).

    당신이 찾고있는 것은 Vaadin의 Push 기능과 등록 된 "클라이언트"목록에 메시지를 보내는 방법입니다 (이 경우 변경 사항을 알 필요가있는 Vaadin UI).

    Vaadin Push에 대한 자세한 내용은 다음을 참조하십시오. Server Push 활성화 및 Advanced Push 문서

    Vaadin 푸시 기능을 사용하면 브라우저에서 다시 요청하기 위해 기다리지 않고 서버가 클라이언트를 강제로 업데이트 할 수 있습니다.

    메시지 구성 요소는 구독 된 UI에 조치가 필요한 업데이트가 있음을 알리는 방법으로 작동합니다.

    이 말은 여러 사용자가 작업 항목을 다루는 것과 거의 같은 일을하는 프로젝트가 있고 사용자가 알아야 할 변경 사항을 적용 할 수있는 Spring 예약 작업이 있다는 것입니다.

    아래의 예는 Server Push Enabling 문서에서 사용 가능한 예제를 기반으로합니다.

    Broadcaster.java - 인스턴스를 등록하여 브로드 캐스트를 수신하고 브로드 캐스트를 전송하는 기능을 제공하는 메커니즘으로 작동합니다. 아래 예제에서, 나는 메시지 (BroadcastMessage)를 나타내는 클래스를 가지고 있지만 물론 그것을 단순화 할 수있다.

    public class Broadcaster implements Serializable {
    
        private static final long serialVersionUID = 3540459607283346649L;
    
        static ExecutorService executorService = Executors.newSingleThreadExecutor();
    
        private static LinkedList<BroadcastListener> listeners = new LinkedList<BroadcastListener>();
    
        public interface BroadcastListener {
            void receiveBroadcast(BroadcastMessage message);
        }   
    
        public static synchronized void register(BroadcastListener listener) {
            listeners.add(listener);
        }
    
        public static synchronized void unregister(BroadcastListener listener) {
            listeners.remove(listener);
        }
    
        public static synchronized void broadcast(final BroadcastMessage message) {
            for (final BroadcastListener listener: listeners)
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        listener.receiveBroadcast(message);
                    }
                });
        }
    }
    

    다음은 BroadcastMessage에 정의 된 클래스입니다. 아이디어는 내가 가지고있는 메시지의 종류와 맵의 ​​형태로 일부 페이로드를 나타내는 방법을 갖는 것입니다.

    public class BroadcastMessage implements Serializable {
    
        private static final long serialVersionUID = 5637577096751222106L;
    
        public BroadcastMessageType messageType;
        public Map<String, String> params;
    
        public BroadcastMessage() {
        }
    
        public BroadcastMessage(BroadcastMessageType messageType) {
            this.messageType = messageType;
            this.params = new HashMap<String, String>();
        }
    
        public BroadcastMessage(BroadcastMessageType messageType, Map<String, String> params) {
            this.messageType = messageType;
            this.params = params;
        }
    
        public BroadcastMessageType getMessageType() {
            return messageType;
        }
        public void setMessageType(BroadcastMessageType messageType) {
            this.messageType = messageType;
        }
        public Map<String, String> getParams() {
            return params;
        }
        public void setParams(Map<String, String> params) {
            this.params = params;
        }
    
    }
    

    이것은 브로드 캐스트를 청취하려는 예제 Vaadin UI입니다. @Push 주석을 주목하십시오. 이 옵션이 없으면 클라이언트는 브라우저가 결정할 때만 새로 고칩니다. @Push로 바로 처리 **

    @SpringComponent
    @UIScope
    @Push
    @SpringView(name=TaskListComponent.NAME)
    public class TaskListComponent extends MyCustomComponent implements Broadcaster.BroadcastListener, View {
    
        /**  PRUNED DOWN, TO DEMONSTRATE THE KEY CODE  **/
    
        // Register this window when we enter it
        @Override
        public void enter(ViewChangeEvent event) {
            Broadcaster.register(this);
    
        }
    
         // Must also unregister when the UI expires    
        @Override
        public void detach() {
            Broadcaster.unregister(this);
            super.detach();
        }
    
        // Receive a broadcast
        @Override
        public void receiveBroadcast(BroadcastMessage message) {
    
            getUI().access(new Runnable() {
                @Override
                public void run() {
                    // DO WHATEVER YOU NEED TO DO HERE.
                    // I CALLED INITIALIZE BUT IT COULD BE 
                    // JUST YOU FIELD UPDATE
                    if ( message.getMessageType().equals(BroadcastMessageType.REFRESH_TASK_LIST) )
                        initialize();
                }
            }); 
    
        }
    
    }
    

    나머지 인터페이스에서 메시지를 보내려면 다음을 수행하십시오.

    Broadcaster.broadcast( 
        new BroadcastMessage( 
            BroadcastMessageType.AUTO_REFRESH_LIST
        ) 
    );
    

    희망이 도움이! :)

  2. from https://stackoverflow.com/questions/39532142/vaadin-get-reference-of-ui-to-change-data by cc-by-sa and MIT license