java - Gluon Connect 在使用 Charm 依赖项进行 POST 时返回 NPE > 4.3.3

标签 java gluon-mobile

尝试发送 POST 请求时,我使用以下代码:

RestClient post = RestClient.create()
        .method("POST")
        .host(host)
        .path(path)
        .contentType("application/json");
Chicken chicken = new Chicken(name, age);
GluonObservableObject<Chicken> o = DataProvider.storeObject(chicken,
        post.createObjectDataWriter(Chicken.class));
o.exceptionProperty().addListener((obs, ol, nw) -> System.err.println("post: " + nw));
o.initializedProperty().addListener((obs, ol, nw) -> {
    if (nw)
        retrieveList.add(o.get());
});

Chicken 是一个 POJO:

public class Chicken {

    private String name;
    private int age;
    private int id = 12;

    public Chicken() {}

    public Chicken(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setter for all fields, equals and hashcode and toString
}

带有 JAX-RS 的服务器端点是

@POST
@Consumes(MediaType.APPLICATION_JSON + "; " + CHARSET)
@Produces(MediaType.APPLICATION_JSON + "; " + CHARSET)
public Response save(JsonObject chicken) {
    // do stuff
    return Response.ok(response).build();
}

在gradle文件中

dependencies {
    compile 'com.gluonhq:glisten-afterburner:1.2.0'
    compile 'com.gluonhq:charm:4.3.3'
}

如果我指定版本 4.3.2 或 4.3.3(如上),它可以正常工作。但是,如果我指定 4.3.4 或 4.3.5 将停止工作。在客户端打印错误流

post: java.lang.NullPointerException

在服务器上(Wildfly 10.1)

11:17:20,839 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n] (default task-35) RESTEASY002010: Failed to execute: javax.ws.rs.NotSupportedException: RESTEASY003065: Cannot consume content type
    at org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:387)
    at org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:121)
    at org.jboss.resteasy.core.registry.RootNode.match(RootNode.java:43)
    at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48)
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:445)
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:264)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:201)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我不知道为什么“无法使用内容类型”对于 4.3.4 但对于 4.3.3 可以。在 javadoc 中找不到差异。

我可以在 github 上更新项目以获得完整的服务器-客户端类型的 MCVE。

最佳答案

这确实是最近引入的一个错误。作为解决方法,您应该能够手动设置 header :

RestClient post = RestClient.create()
    .method("POST")
    .host(host)
    .path(path)
    .header("Content-Type", "application/json");
//    .contentType("application/json");

这个bug本身会在下一个版本中修复。

关于java - Gluon Connect 在使用 Charm 依赖项进行 POST 时返回 NPE > 4.3.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44094739/

相关文章:

java - 在 SQLException 中获取 OUT 参数

java - OSGi 中的速度 : how to load templates from classpath

java - Play 2.0 并未运行所有测试

java - NoSuchMethodError - 没有静态方法比较 (java/util/Comparator)

java - 如何在 JavaFX 中正确地将对话框放入动画计时器中

java - Spring Boot hello world MVC 应用程序无法加载

java - 无法解决 DispatcherServlet 的 ClassNotFoundException(在 Spring 上)

ios - 异常构建 gradle 任务 launchIosDevice

java - Gluon 应用程序无法在 iOS 上启动

android - 使用 gluon 移动插件在开发 JavaFX 移动应用程序时进行调试