Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RestEasy异步请求中的空指针异常_Java_Asynchronous_Jax Rs_Resteasy_Wildfly 8 - Fatal编程技术网

Java RestEasy异步请求中的空指针异常

Java RestEasy异步请求中的空指针异常,java,asynchronous,jax-rs,resteasy,wildfly-8,Java,Asynchronous,Jax Rs,Resteasy,Wildfly 8,我在Resteasy中工作,我必须向服务器发出异步请求。真正的目的是,我将提交一个表单,该表单将转换为一个.xlsx文件,至少需要10秒才能完成。所以异步请求是最好的方法。我遵循以下链接中的程序 我像这样提出ajax请求 $.ajax({ url : 'rest/parentPath/childPath', type : 'GET', success : function(data, status, xhr) { console.log(xhr.getR

我在Resteasy中工作,我必须向服务器发出异步请求。真正的目的是,我将提交一个表单,该表单将转换为一个.xlsx文件,至少需要10秒才能完成。所以异步请求是最好的方法。我遵循以下链接中的程序

我像这样提出ajax请求

$.ajax({
    url : 'rest/parentPath/childPath',
    type : 'GET',
    success : function(data, status, xhr) {
        console.log(xhr.getResponseHeader('Location'));
    },
    failure : function(data) {
        console.log(data);
    },
    error : function(error,status) {

    }
});
ParentClass.java

import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;

@Component
@Path("/parentPath")
public class ParentClass {
    @GET
    @Path("childPath")
    @Produces("text/plain")
    public void asyncFunction(@Suspended final AsyncResponse response){
        Thread t = new Thread() {
            @Override
            public void run()
            {
                try
                {
                    Response jaxrs = Response.ok("basic").type(MediaType.TEXT_PLAIN).build();         
                    System.out.println("entered======================= =================================================");
                    response.resume(jaxrs);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        };
        t.start();
    }
}
如果我只是发出一个ajax请求,它会给出
503服务不可用错误
,但我确实执行了异步任务,我可以通过查看wildfly日志中的sysout来确认。但这并不是异步的一种方式。我必须能够在第二个请求中看到异步任务的响应。我遵循了这个链接中的程序

如果我在请求url中放入
?asynch=true
,我会立即得到一个
202 Accepted
的响应,响应中有一个异步作业的位置。但它甚至没有进入try声明。在wildfly终端中抛出一个错误,如下所示

19:11:41,733 WARN  [org.jboss.resteasy.core.ExceptionHandler] (pool-4-thread-1) Failed executing GET /parentPath/childPath: org.jboss.resteasy.spi.BadRequestExcept
ion: Failed processing arguments of org.jboss.resteasy.spi.metadata.ResourceMethod@44d4407c
        at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:104) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:112) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.AsynchronousDispatcher.invokeSuper(AsynchronousDispatcher.java:237) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:278) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.AsynchronousDispatcher$1.call(AsynchronousDispatcher.java:269) [resteasy-jaxrs-3.0.10.Final.jar:]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_25]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_25]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_25]
        at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_25]
Caused by: java.lang.NullPointerException
        at org.jboss.resteasy.core.ResourceMethodInvoker.initializeAsync(ResourceMethodInvoker.java:374) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.AsynchronousResponseInjector.inject(AsynchronousResponseInjector.java:43) [resteasy-jaxrs-3.0.10.Final.jar:]
        at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:89) [resteasy-jaxrs-3.0.10.Final.jar:]
        ... 12 more
如果我使用
asynch=true
再次发出相同的请求,它将显示相同的错误,但使用
(pool-4-thread-2)
而不是
(pool-4-thread-1)

这意味着异常不会发生在服务器端,而是发生在运行时层。因为在我的代码中发生的任何异常都将出现在日志文件中,但不会出现在wildfly终端中。我将发布web.xml、WebConfig.java、build.gradle文件。我只是在复制jboss文档中所做的同样的事情,但我不明白为什么这个异常会发生在wildfly层

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <display-name>Web Application</display-name>

    <distributable />

    <listener>
        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <listener>
        <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
    </listener>

    <!-- Context Configuration locations for Spring XML files -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/applicationContext-resources.xml
            classpath:/applicationContext-dao.xml
            classpath:/applicationContext-service.xml
            classpath*:/applicationContext.xml
            /WEB-INF/applicationContext*.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>

    <context-param>
        <param-name>resteasy.async.job.service.enabled</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>resteasy.async.job.service.max.job.results</param-name>
        <param-value>100</param-value>
    </context-param>

    <!-- Maximum wait time on a job when a client is querying for it -->
    <context-param>
        <param-name>resteasy.async.job.service.max.wait</param-name>
        <param-value>300000</param-value>
    </context-param>

    <!-- Thread pool size of background threads that run the job -->
    <context-param>
        <param-name>resteasy.async.job.service.thread.pool.size</param-name>
        <param-value>100</param-value>
    </context-param>

    <!-- Set the base path for the Job uris -->
    <context-param>
        <param-name>resteasy.async.job.service.base.path</param-name>
        <param-value>/asynch/jobs</param-value>
    </context-param>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.mypackage.service.WebConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>login.html</welcome-file>
    </welcome-file-list>

</web-app>

试图添加注释,但字数有限
我现在可以做异步工作了。我发现使用AsynchResponse和和挂起的注释会导致此异常。异步作业处理不需要此选项。
使用空指针的原因是两者混淆

有两个异步的东西,文档实际上把它们混淆了
1. 异步响应:使用Suspended和AsynchResponse将释放接收请求的服务器线程,工作将由创建的新线程完成。但是客户端将等待响应。直到新线程完成并将其发送回。为此,不需要对web.xml进行任何更改


2异步作业处理:在这里,您可以在web.xml和任何其他可选参数(如果需要)中将resteasy.async.Job.service.enabled设置为true。不需要对APi进行其他更改。我的方法是
@POST
@路径(“/helloworld”)
公共响应getHelloWorld(){
log.info(“调用的API”);
longLiftingJob();
log.info(“API调用完成”);
返回Response.status(200).entity(“helloworld”).build();
}

使用web.xml中的true参数,框架将调用您在新线程中的调用(简单地说),并在202响应中返回相同的作业id。作为位置标题作为
位置→ http://127.0.0.1:8080/myrest/asynch/jobs/1432015827488-1


客户端对上述url执行GET/POST,并在API完成后获得API返回的响应。但实际的客户端从未等待过如此异步的工作。

感谢您的回复。我现在正在做一个不同的项目,所以有空的时候我会试试。
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class WebConfig extends Application {

    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> empty = new HashSet<Class<?>>();

    public WebConfig() {
        // ADD YOUR RESTFUL RESOURCES HERE
        this.singletons.add(new SignupService());
        this.singletons.add(new UserService());
        this.singletons.add(new ParentClass());
    }

    public Set<Class<?>> getClasses()
    {
        return this.empty;
    }

    public Set<Object> getSingletons()
    {
        return this.singletons;
    }

}
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
apply plugin: 'eclipse'

// Uses JDK 8
sourceCompatibility = 1.8
targetCompatibility = 1.8

// 1. Get dependencies from Maven local repository
// 2. Get dependencies from Maven central repository
repositories {
    mavenLocal()
    mavenCentral()
    maven  {
        url "http://repo1.maven.org/maven2"
    }
}

configurations {
    provided
}
  sourceSets {
    main { compileClasspath += configurations.provided }
}

//Project dependencies
dependencies {

    //Spring framework core
    compile 'org.springframework:spring-web:4.1.4.RELEASE'
    compile 'org.springframework:spring-core:4.1.4.RELEASE'
    compile 'org.springframework:spring-context:4.1.4.RELEASE'
    compile 'org.springframework:spring-context-support:4.1.4.RELEASE'
    compile 'org.springframework:spring-orm:4.1.4.RELEASE'

    compile 'org.springframework.security:spring-security-core:4.0.0.RELEASE'

    //MySQL database driver
    //compile 'mysql:mysql-connector-java:5.1.34'
    compile 'com.oracle:ojdbc6:11.2.0.1.0'


    //Hibernate framework 
    compile 'org.hibernate:hibernate-core:4.3.8.Final'
    compile 'commons-dbcp:commons-dbcp:1.2.2'

    //Servlet API
    compile 'javax.servlet:servlet-api:2.5'

    //Base-64 Apache commons
    compile 'commons-codec:commons-codec:1.10'

    //log4j
    compile 'log4j:log4j:1.2.17'
    compile 'org.slf4j:slf4j-simple:1.7.10'

    //XmlBeans Equity Valuation
    compile 'org.apache.xmlbeans:xmlbeans:2.6.0'

    //Poi Equity Valuation
    compile 'org.apache.poi:poi:3.10.1'

    //Poi ooxml Equity Valuation
    compile 'org.apache.poi:poi-ooxml:3.10.1'

    //Poi ooxml Schemas Equity Valuation
    compile 'org.apache.poi:poi-ooxml-schemas:3.10.1'

    //Jacob Equity Valuation
    compile 'jacob:jacob:1.18-M2'

    //Google gson
    compile 'com.google.code.gson:gson:2.3.1'

    provided 'org.jboss.resteasy:resteasy-jaxrs:3.0.11.Final'

    provided 'org.jboss.resteasy:resteasy-spring:3.0.11.Final'

}