kumuluz / kumuluzee

Lightweight open-source framework for developing microservices using standard Java EE technologies and migrating Java EE to cloud-native architecture.
https://ee.kumuluz.com
MIT License
291 stars 71 forks source link

FormDataContentDisposition and FormDataParam error #200

Closed ChristianLoza closed 3 years ago

ChristianLoza commented 3 years ago

Hello I am trying to use FormDataContentDisposition and FormDataParam, but I get an error when I deploy the application, this error is possibly generated because the framework has the Application class from jax-rs extended. Is there a way that I can bypass this class? Or some alternative way so that this error is not displayed.


@ApplicationPath("api")
@SwaggerDefinition(info = @Info(title = "Example", version = "v1.0.0"))
@CrossOrigin
public class ServiceResource extends Application  {
}
@POST
    @Path("/pdf")
    @Consumes({MediaType.MULTIPART_FORM_DATA})
    public Response uploadPdfFile(  @FormDataParam("file") InputStream fileInputStream,
                                    @FormDataParam("file") FormDataContentDisposition fileMetaData) throws Exception
    {
        String UPLOAD_PATH = "c:/temp/";
        try
        {
            int read = 0;
            byte[] bytes = new byte[1024];

            OutputStream out = new FileOutputStream(new File(UPLOAD_PATH + fileMetaData.getFileName()));
            while ((read = fileInputStream.read(bytes)) != -1)
            {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e)
        {
            throw new WebApplicationException("Error while uploading file. Please try again !!");
        }
        return Response.ok("Data uploaded successfully !!").build();
    }
2021-05-03 01:59:16,055 ERROR -- org.glassfish.jersey.internal.Errors --  Following issues have been detected: 
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response edu.example.core.service.Example.uploadPdfFile(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) throws java.lang.Exception at index 0.
 {}  
2021-05-03 01:59:16,055 WARN -- org.eclipse.jetty.server.handler.ContextHandler.ROOT --  unavailable {} org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response edu.example.core.service.Example.uploadPdfFile(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) throws java.lang.Exception at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class edu.example.core.service.Example, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@55c03e4]}, definitionMethod=public javax.ws.rs.core.Response edu.example.core.service.Example.uploadPdfFile(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) throws java.lang.Exception, parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:371)
    at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:292)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:347)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:624)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:407)
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:731)
    at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
    at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:755)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1457)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1422)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:911)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
    at org.eclipse.jetty.server.Server.start(Server.java:423)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
    at org.eclipse.jetty.server.Server.doStart(Server.java:387)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.kumuluz.ee.jetty.JettyServletServer.startServer(JettyServletServer.java:86)
    at com.kumuluz.ee.EeApplication.initialize(EeApplication.java:318)
    at com.kumuluz.ee.EeApplication.<init>(EeApplication.java:66)
    at com.kumuluz.ee.EeApplication.main(EeApplication.java:78)

2021-05-03 01:59:16,061 WARN -- org.eclipse.jetty.webapp.WebAppContext --  Failed startup of context o.e.j.w.WebAppContext@bfc14b9{/,[file:///tmp/kumuluzee-tmp-webapp5063037800516613043/, file:///home/example/target/classes/META-INF/resources/],UNAVAILABLE} {} javax.servlet.ServletException: edu.example.core.service.ServiceResource==org.glassfish.jersey.servlet.ServletContainer@230e4725{jsp=null,order=1,inst=true,async=true,src=JAVAX_API:null}
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:642)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:407)
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:731)
    at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
    at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:755)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1457)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1422)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:911)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
    at org.eclipse.jetty.server.Server.start(Server.java:423)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
    at org.eclipse.jetty.server.Server.doStart(Server.java:387)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
    at com.kumuluz.ee.jetty.JettyServletServer.startServer(JettyServletServer.java:86)
    at com.kumuluz.ee.EeApplication.initialize(EeApplication.java:318)
    at com.kumuluz.ee.EeApplication.<init>(EeApplication.java:66)
    at com.kumuluz.ee.EeApplication.main(EeApplication.java:78)
Caused by: org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response edu.example.core.service.Example.uploadPdfFile(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) throws java.lang.Exception at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class edu.example.core.service.Example, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@55c03e4]}, definitionMethod=public javax.ws.rs.core.Response edu.example.core.service.Example.uploadPdfFile(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) throws java.lang.Exception, parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:371)
    at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:292)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:347)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:624)
    ... 26 more

2021-05-03 01:59:16,077 INFO -- org.eclipse.jetty.server.AbstractConnector --  Started ServerConnector@44e3760b{HTTP/1.1, (http/1.1)}{0.0.0.0:8081} {}  
2021-05-03 01:59:16,077 INFO -- org.eclipse.jetty.server.Server --  Started @7872ms {}  
2021-05-03 01:59:16,077 INFO -- EeApplication --  KumuluzEE started successfully {} 
cen1 commented 3 years ago

Try to register the multipart feature in your Application:

@Override
public Map<String, Object> getProperties() {
    Map<String, Object> props = new HashMap<>();

    props.put("jersey.config.server.provider.classnames", "org.glassfish.jersey.media.multipart.MultiPartFeature");

    return props;
}
ChristianLoza commented 3 years ago

Hello, thank you very much for your answer, I tried the following codes:

i had same error: @Override public Set<Class<?>> getClasses() {

    final Set<Class<?>> resources = new HashSet<Class<?>>();
    resources.add(MultiPartFeature.class);
    resources.add(Example.class);
    return super.getClasses();
}

when added getProperties():

@ApplicationPath("api")
@SwaggerDefinition(info = @Info(title = "SDP-EPIS", version = "v1.0.0"))
@CrossOrigin
public class ServiceResource extends Application  {

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> props = new HashMap<>();

        props.put("jersey.config.server.provider.classnames", "org.glassfish.jersey.media.multipart.MultiPartFeature");

        return props;
    }
}

I had next error,

,UNAVAILABLE} {} java.lang.NoClassDefFoundError: org/glassfish/jersey/server/internal/inject/AbstractValueFactoryProvider at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at com.kumuluz.ee.loader.EeClassLoader.findJarClass(EeClassLoader.java:399) at com.kumuluz.ee.loader.EeClassLoader.loadClass(EeClassLoader.java:468) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.glassfish.jersey.media.multipart.internal.FormDataParamInjectionFeature.configure(FormDataParamInjectionFeature.java:66) at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:728) at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:736) at org.glassfish.jersey.model.internal.CommonConfig.configureMetaProviders(CommonConfig.java:647) at org.glassfish.jersey.server.ResourceConfig.configureMetaProviders(ResourceConfig.java:823) at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:328) at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:293) ...

I am not adding any additional jersey dependencies in my pom file this is my pom:


   <dependencies>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-servlet-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-cdi-weld</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-jax-rs-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-jpa-hibernate</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-jta-narayana</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.logs</groupId>
            <artifactId>kumuluzee-logs-log4j2</artifactId>
            <version>${kumuluzee-logs.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.rest</groupId>
            <artifactId>kumuluzee-rest-core</artifactId>
            <version>${kumuluzee-rest.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.cors</groupId>
            <artifactId>kumuluzee-cors</artifactId>
            <version>${kumuluzee-cors.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.health</groupId>
            <artifactId>kumuluzee-health</artifactId>
            <version>${kumuluzee-health.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.swagger</groupId>
            <artifactId>kumuluzee-swagger</artifactId>
            <version>${kumuluzee-swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.swagger</groupId>
            <artifactId>kumuluzee-swagger-ui</artifactId>
            <version>${kumuluzee-swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee</groupId>
            <artifactId>kumuluzee-javamail-ri</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kumuluz.ee.testing</groupId>
            <artifactId>kumuluzee-arquillian-container</artifactId>
            <version>${kumuluzee-arquillian-container.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.arquillian.junit</groupId>
            <artifactId>arquillian-junit-container</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>

        <!--        -->
        <dependency>
            <groupId>com.github.dozermapper</groupId>
            <artifactId>dozer-core</artifactId>
            <version>6.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.kumuluz.ee</groupId>
                <artifactId>kumuluzee-maven-plugin</artifactId>
                <version>${kumuluzee.version}</version>
                <executions>
                    <execution>
                        <id>package</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
cen1 commented 3 years ago

I made a sample project here: https://github.com/kumuluz/kumuluzee-samples/tree/feature/restForm/kumuluzee-rest-form

It works just by adding feature registration and adding the jersey-media-multipart pom dependency.

If it still does not help your case I suspect one of your dependencies is playing weird with jersey. Let me know to investigate further.

I was running tests as exploded from Intellij, running from packaged jar might be another thing that could be a culprit although not likely.

ChristianLoza commented 3 years ago

thanks @cen1 Thank you very much for your answers, I made the corresponding example and it worked, there were also some conflicts with other libraries