首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Errai-jaxrs -不良请求

Errai-jaxrs -不良请求
EN

Stack Overflow用户
提问于 2013-05-10 09:42:00
回答 1查看 537关注 0票数 0

我在使用我的应用程序运行Errai时遇到了很大的问题,我从GWT模式获得了这个错误:

代码语言:javascript
复制
org.jboss.errai.enterprise.client.jaxrs.api.ResponseException: Bad Request    
at org.jboss.errai.enterprise.client.jaxrs.AbstractJaxrsProxy$1.onResponseReceived(AbstractJaxrsProxy.java:132)    
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)    
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)    
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)    
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    
at java.lang.reflect.Method.invoke(Method.java:474)    
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)    
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)    
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)    
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)    
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)    
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)    
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)    
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)    
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)    
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)    
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)    
at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)    
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    
at java.lang.reflect.Method.invoke(Method.java:474)    
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)    
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)    
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)    
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)    
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)    
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)    
at java.lang.Thread.run(Thread.java:722)

在服务器端:

代码语言:javascript
复制
[INFO] Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "^EncodedType" (Class com.mycompany.client.shared.Customer), not marked as ignorable
[INFO]  at [Source: org.mortbay.jetty.HttpParser$Input@115194d; line: 1, column: 18] (through reference chain: com.mycompany.client.shared.Customer["^EncodedType"])
[INFO]  at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
[INFO]  at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
[INFO]  at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
[INFO]  at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
[INFO]  at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
[INFO]  at org.codehaus.jackson.map.deser.BeanDeserializer._handleUnknown(BeanDeserializer.java:725)
[INFO]  at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:703)
[INFO]  at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
[INFO]  at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)

从堆栈跟踪来看,它看起来是一个糟糕的请求。这个版本的后端是RestEasy + Guice,它的配置非常正确,因为在我尝试使用errai之前,我只是使用了运行良好的普通GWT RequestBuilder。我不知道问题出在哪里,但这是我的代码:

CustomerService.java

代码语言:javascript
复制
@Path("/customerservice")
public interface CustomerService {
    @GET
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)     
    public Customer getCustomer(String id);

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String createCustomer(Customer Customer);
}

CustomerServiceImpl.java

代码语言:javascript
复制
@Singleton
public class CustomerServiceImpl implements CustomerService {
    @Override
    public Customer getCustomer(String id) {
        return new Customer();
    }

    @Override
    public String createCustomer(Customer Customer) {
        return "1";
    }
}

在客户端:

代码语言:javascript
复制
@Inject
private Caller<CustomerService> customerService;

@EventHandler("submit")
public void createCustomer(ClickEvent event) {   
    event.preventDefault();
    Customer customer = new Customer();
    customerService.call(new RemoteCallback<String>() {
        @Override
        public void callback(String response) {
            Window.alert("Customer created: " + response);
        }
    }).createCustomer(customer);
}

有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-10 13:58:24

我可以从堆栈跟踪中看到,您正在使用Jackson处理服务器端的编组请求和响应数据,但客户端使用的是Errai的默认编组格式。

您必须决定是使用Errai的编组格式还是使用Jackson。

Errai编组

Errai编组格式的优点是它在连线上包含了更多的类型信息(比如Jackson解析器抱怨的"^EncodedType“属性)。当您的JAX主要用于Errai客户端时,这是最好的选择。这也是您能够通过电线发送这样一个对象的唯一方式:

代码语言:javascript
复制
@Portable class TypeWithPolymorphicField {
  private Object foo = new Foo();
}

要在服务器端启用Errai编组(而不是杰克逊),您需要使用应用程序部署errai-jaxrs-provider-[version].jar。来自Errai参考指南

代码语言:javascript
复制
<dependency>
  <groupId>org.jboss.errai</groupId>
  <artifactId>errai-jaxrs-provider</artifactId>
  <version>${errai.version}</version>
</dependency>

杰克逊编组

另一方面,如果您的JAX-RS API打算由非Errai客户端使用,他们可能会发现杰克逊编组更令人愉快和熟悉。如果选择这种方式,则需要告诉客户端使用Jackson编组而不是默认设置。来自Errai参考指南

以下选项可用于激活客户端上的Jackson编组。注意,这是客户端配置,假定JAX-RS端点已经返回了Jackson表示(所有JAX实现都支持Jackson)。在这种情况下,不需要在服务器上部署errai-jaxrs-provider.jar!或者使用JSNI方法: 私有本机setJacksonMarshallingActive(布尔活动) /*-{ $wnd.erraiJaxRsJacksonMarshallingActive = active;}-*/; 或简单地援引: RestClient.setJacksonMarshallingActive(真);

最后注意:不要同时做以上两件事,否则你将陷入相反的问题!您必须将客户端或服务器配置为远离其自然默认设置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16479366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档