在Google io 2011中,David Chandler提到您可以使用append()方法链接不同的请求上下文,但在实践中,我不知道如何在它们具有不同的接收器时将它们链接起来,使用to()然后触发( )?
请帮忙.
我想使用ValueProxy参数调用Service上的方法 - 如果我执行personProxy.setName("test")然后request.callFn(personProxy).fire(),则name属性不会传递给服务器.
在设置名称或其他内容之前,我应该执行request.edit(personProxy)吗?
这是我正在使用的实现:
//somewhere in MyActivity.java ...
PersonProxy cp = requestFactory.myRequest().create(PersonProxy.class);
cp.setName("John Doe");
requestFactory.myRequest().doSomething(cp,"extra_param_value").fire(new Receiver<List<PersonProxy>>() {
@Override
public void onSuccess(List<PersonProxy> response) {
//response from server...
}
});
//------------------------
public interface MyRequestFactory extends RequestFactory {
MyRequest myRequest();
}
//------------------------
@ServiceName(value="com.server.MyService", locator="com.server.MyServiceLocator")
public interface MyRequest extends RequestContext {
public Request<Integer> doSomething(PersonProxy param, String extraParam);
}
//------------------------
public class MyServiceLocator implements ServiceLocator {
public Object getInstance(Class<?> clazz) {
return new MyService();
}
}
//------------------------
public class MyService {
public Integer doSomething(Person …Run Code Online (Sandbox Code Playgroud) GWT 2.4在客户端上提供服务继承(问题6234,问题6035).
我一直在等待这个未来很长一段时间,因为它在客户端上节省了大量重复的代码.我已经开始实施它,但是因为混合成功.
这是我的代码:
public interface BaseEntityRequest<T>
{
Request<Void> put(T entity);
Request<List<T>> getAllOrderBy(String propertyName);
Request<List<T>> getRangeAndFilter(int limit,int offset, QueryInfoProxy queryInfo);
}
@Service(value = EgdDao.class, locator = DaoServiceLocator.class)
public interface EgdRequest extends RequestContext, BaseEntityRequest<EgdProxy>
{
Request<Void> exportToExcel(QueryInfoProxy queryInfo, String userName);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,getAllOrderBy与getRangeAndFilter做工精细,但put(T entity)没有.
我在控制台中收到以下错误:
[ERROR] Unexpected error
java.util.NoSuchElementException
Run Code Online (Sandbox Code Playgroud)
这将在接收器onFailure ServerFailure消息中返回:
Error 500 INTERNAL_SERVER_ERROR
HTTP ERROR 500
Problem accessing /gwtRequest. Reason:
INTERNAL_SERVER_ERROR
Run Code Online (Sandbox Code Playgroud)
我可以看到,唯一的原因是put,当其他方法不工作时,它使用通用参数T.当我put在EgdRequest界面中移动方法(使用EgdProxy作为参数而不是T)时,它开始工作,所以我知道我的服务器代码很好.
有没有人知道如何正确实现这一点? …
我正在使用GWT 2.4编辑器并请求工厂框架.我有一个模型Trip,它有一个地址'origin'和一个Address'destination'.通过UI创建Trip时,会自动创建这两个地址并将其分配给Trip.用户填写详细信息并保存.出于某种原因,我在尝试持久化到服务器时遇到"autobean冻结错误".此代码在GWT 2.3中有效,我无法切换回来.我希望它不是GWT 2.4中的错误.以下是我正在做的一些示例代码:
RequestContext request = requestFactory.request();
TripProxy trip = request.create(TripProxy.class);
trip.setOrigin(request.create(AddressProxy.class));
trip.setDestination(request.create(AddressProxy.class));
driver.edit(trip, request);
this.trip = trip;
// … on save button clicked (different method)
RequestContext request = driver.flush();
request.save(trip).with(driver.getPaths()).fire(someReceiverImpl);
Run Code Online (Sandbox Code Playgroud)
结果是:
java.lang.IllegalStateException: The AutoBean has been frozen
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.checkFrozen(AbstractAutoBean.java:195)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.setProperty(AbstractAutoBean.java:270)
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
调用fire成功完成但在requestfactory内的某处,抛出上述错误.奇怪的是,实体保存在服务器上,但不强制执行验证.当我简化模型并删除地址关联时,验证和保存工作.我的主要问题是autobean冻结错误; 验证的东西是次要的.
编辑:经过进一步的调查,我发现实体正在使服务器正常,并按预期持续存在.它返回时抛出上述异常.AddressProxy是一个ValueProxy,它看起来像RF不喜欢Trip带回这些关联.返回null'修复'问题,但这显然不会长期工作.
在服务器端我有:
public void throwException() throws Exception {
throw new NullPointerException("fslkdjflks");
}
Run Code Online (Sandbox Code Playgroud)
在客户端我有:
_requestFactory.myService().throwException().fire(new Receiver<Void>() {
@Override
public void onSuccess(Void response) {
// TODO Auto-generated method stub
}
@Override
public void onFailure(ServerFailure error) {
// TODO Auto-generated method stub
Window.alert(error.getExceptionType() + " " + error.getMessage());
}
});
Run Code Online (Sandbox Code Playgroud)
error.getExceptionType()返回null,而不是异常的类型.知道为什么吗?
谢谢,吉拉德.
是否可以通过请求工厂上传文件?简单的例子将非常有用.
我正在尝试使用GWTs RequestFactory(目前)做一些非常简单的事情并返回一个对象列表,每个对象包含一些数据和另一个对象.我似乎无法获得我的其他对象 - 相反,我总是得到null.
我的代码看起来像这样......
我有一些UserMessage对象,每个对象都包含一个Message对象.
UserMessage
@Entity
public class UserMessage implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Version
private Integer version = 0;
@ManyToOne
@JoinColumn(name = "messageId")
private Message message;
private String user;
private int priority;
private boolean read;
private Date expiry;
private boolean sent;
... getter/setters etc
Run Code Online (Sandbox Code Playgroud)
信息
@Entity(name = "UUMessage")
public class Message implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Version …Run Code Online (Sandbox Code Playgroud) 有人可以向我展示一个关于使用GWT RequestFactory进行会话处理的简单示例.也许这很简单,但我无法弄清楚.
我在某处读到了我应该使用的ThreadLocal.好吧,我做到了.这是我的代码:
public class EC_RequestFactoryServlet extends RequestFactoryServlet {
private static final ThreadLocal < HttpServletRequest > uniqueReq =
new ThreadLocal < HttpServletRequest > () {
@Override protected HttpServletRequest initialValue() {
return null;
}
};
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException
{
uniqueReq.set(req);
super.doPost(req, res);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
uniqueReq.set(req);
super.doGet(req, res);
}}
Run Code Online (Sandbox Code Playgroud)
这节省了会话:
public class Authentication {
public static void SetLoggedInUserToSession(User user) {
EC_RequestFactoryServlet.getThreadLocalRequest()
.getSession().setAttribute("LOGGED_IN_USER", user);
}
public …Run Code Online (Sandbox Code Playgroud) 如果我使用GWT Requestfactory,那么向客户端发送"404未找到"或"401未授权"的推荐方法是什么?
问候安德烈亚斯
今天我们开始在生产中遇到这个未知错误
2012 02 06 08:19:39,270 ERROR GWTSpringRequestFactoryServlet$CustomExceptionHandler:34 – Server error
com.google.web.bindery.requestfactory.server.ReportableException: The requested type is not default-instantiable
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.report(ServiceLayerDecorator.java:255)
at com.google.web.bindery.requestfactory.server.ReflectiveServiceLayer.createDomainObject(ReflectiveServiceLayer.java:94)
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.createDomainObject(ServiceLayerDecorator.java:51)
at com.google.web.bindery.requestfactory.server.LocatorServiceLayer.createDomainObject(LocatorServiceLayer.java:41)
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.createDomainObject(ServiceLayerDecorator.java:51)
at com.google.web.bindery.requestfactory.server.RequestState.getBeansForIds(RequestState.java:238)
at com.google.web.bindery.requestfactory.server.RequestState.getBeansForPayload(RequestState.java:147)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processOperationMessages(SimpleRequestProcessor.java:501)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:210)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:127)
at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at …Run Code Online (Sandbox Code Playgroud) 我Autofac.ContainerBuilder在我的ASP.Net MVC 4应用程序中使用,这使得默认控制器出现问题以生成多个实例.
我试着这样处理它
builder.RegisterType<AccountController>().As<IController>().PreserveExistingDefaults();
Run Code Online (Sandbox Code Playgroud)
但没用
码
protected void Application_Start()
{
var dataPath = "~/App_Data/" + ConfigurationManager.AppSettings["Blog_Site"];
var builder = new ContainerBuilder();
builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>().InstancePerHttpRequest();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker().InstancePerHttpRequest();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterType<JsonRepository>().As<IRepository>().InstancePerLifetimeScope().WithParameter("dataPath", HttpContext.Current.Server.MapPath(dataPath));
builder.RegisterType<ConfigService>().As<IConfigService>().InstancePerLifetimeScope();
builder.RegisterType<EntryService>().As<IEntryService>().InstancePerLifetimeScope();
builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
builder.RegisterType<MessageService>().As<IMessageService>().InstancePerLifetimeScope();
builder.RegisterType<CloudService>().As<ICloudService>().InstancePerLifetimeScope();
builder.RegisterType<Services>().As<IServices>().InstancePerLifetimeScope();
_containerProvider = new ContainerProvider(builder.Build());
ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory(ContainerProvider));
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
AuthConfig.RegisterAuth();
HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
// Quartz.NET scheduler
ISchedulerFactory factory = new StdSchedulerFactory();
var scheduler = factory.GetScheduler();
scheduler.JobFactory = new AutofacJobFactory(ContainerProvider);
scheduler.Start();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试访问默认控制器帐户/管理我得到以下错误.
这我是如何看待的
@Html.Action("RemoveExternalLogins")
<h3>Add an external login</h3> …Run Code Online (Sandbox Code Playgroud) 我有以下Java servlet执行我称之为" 添加服务 ":
public class AdditionService extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// The request will have 2 Integers inside its body that need to be
// added together and returned in the response.
Integer addend = extractAddendFromRequest(request);
Integer augend = extractAugendFromRequest(request);
Integer sum = addend + augend;
PrintWriter writer = response.getWriter();
writer.write(sum);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图让GWT的RequestFactory做同样的事情(在应用服务器上添加两个数字并将总和作为响应返回)使用ValueProxy和AdditionService,并且遇到了一些问题.
这是AdditionRequest(客户端层),它是一个包含两个要添加的整数的值对象:
// Please note the "tier" (client, shared, server) I have placed …Run Code Online (Sandbox Code Playgroud)