2014-09-30 4 views
4

Я знаю, что эта тема обсуждалась много раз, но я обнаружил, что большая часть информации об этом не обновляется.Интеграция GWT с весной

Я ищу учебник/пример о том, как интегрировать GWT с Spring framework. Я нашел много examplex (некоторые из них даже работают), но только с более старыми библиотеками. Я ищу решение с новейшими библиотеками (или, по крайней мере, совместимыми с новейшими).

Также во многих примерах используется библиотека spring4gwt (для создания серва «клей») - есть ли другой способ?

Я хочу создать пример простого приложения, используя GWT + Spring + Hibernate + Maven. Я начал с создания Web Application Project (от Eclipse). Я преобразовал проект в проект Maven. И, честно говоря, я застрял здесь. Я могу создать простой сервис (+ async), но не знаю, как настроить правильный сервлет и идти дальше. Примеры Я нашел реле на spring4gwt, но я бы не хотел его использовать (без новой версии с 2009 года я думаю).

Было бы здорово, если бы кто-то мог объяснить интеграцию шаг за шагом.

Извините, если этот дубликат, но после длительного поиска я не нашел ясного решения, которое соответствует моим потребностям.

ответ

0

Я создал много проектов с этой настройкой, вам не нужна spring4gwt! Мое решение использовать класс «мост», который позволит вам позвонить асинхронное услуги, такие как пружинные контроллеры:

import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.log4j.Logger; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.context.ServletContextAware; 
import org.springframework.web.servlet.ModelAndView; 

import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

public abstract class BaseRemoteService extends RemoteServiceServlet implements 
     ServletContextAware { 

    private static final long serialVersionUID = 2470804603581328584L; 
    protected Logger logger = Logger.getLogger(getClass()); 
    private ServletContext servletContext; 

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST }) 
    public ModelAndView handleRequest(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     doPost(request, response); 
     return null; // response handled by GWT RPC over XmlHttpRequest 
    } 

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

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

Теперь, ваш * RpcServiceImpl должно быть что-то вроде:

@Controller 
@RequestMapping("/*/action.service") 
public class ActionRpcServiceImpl extends BaseRemoteService implements ActionRpcService { 
    //this class is managed by spring, so you can use @Autowired and other stuffs 
    //implementation of your rpc service methods, 
} 
2

У вас есть много способов интеграции с весной, но я думаю, что лучший вариант использовать RestyGWT Framework

Поскольку вы используете HTTP протокол и JSON формат для сериализации объектов, у вас не будет проблем с общением с Spring Controllers с использованием RestyGWT.

Вы также можете использовать свои собственные контроллеры для ответа на GWT RPC Requests. Вместо использования GWT Dispatcher вы используете Spring MVC Request Dispacher и сопоставляете URLS на контроллерах с вашими услугами в клиенте GWT.

если вы используете RESTY GWT API, вы могли бы просто написать свой интерфейс, карта методы с использованием JAX-RS аннотаций как @POST, @GET, @DELETE, @PathParam и т.д.

Вот что я делаю на моем проекте, используя RestyGWT:

Проект будет составлять от 2 проекта: проект-клиент проект-сервер

клиент содержит все файлы, связанные с GWT и RestyGWT. Сервер содержит все файлы из реализации на задней панели, используя Spring.

Maven overlay используется для объединения двух проектов на этапе компиляции пакета, поэтому вы заканчиваете окончательную войну с файлами GWT * js и файлами сервера.

Для использования RestyGWT вы должны создать интерфейс, который расширяет RestService:

public interface MyRestService extends RestService{ 
    @GET 
    @Path("/foo") 
    public void getFoo(MethodCallback<List<Foo>); 
    @POST 
    @Path("/foo") 
    public void saveFoo(Foo foo ,MethodCallback<MessageResponse>); 
} 

Чтобы воспользоваться услугой вы пишете что-то вроде этого:

MyRestService service = GWT.create(MyRestService.class); 

и вы будете иметь что-то вроде этого, чтобы использовать обслуживание:

service.getFoo(new MethodCallBack<List<Foo>>(){ 
    public void onSucess(List<Foo> foos){ 
    /* You will get foos, you dont have to worry about serialization, RESTYGWT does it for you */ 
} 
public void onError() ... 
}); 

И лет и будет иметь контроллер для ответа на этот запрос, как это:

@Controller 
class myController{ 

@Autowired FooService svc; 

@RequestMapping(value = "/foo", method = RequestMethod.GET, produces= "application/json") 
public @ResponseBody List<Foo> getAllFoos(){ 


    return svc.all(); 
} 
@RequestMapping(value = "/foo", method = RequestMethod.POST, produces= "application/json", consumes="application/json") 
public @ResponseBody MessageResponse save(@ResponseBody Foo foo){ 
    svc.save(foo);  
    return new MessageResponse("Foo saved with sucess", 200); 
} 

}

Смежные вопросы