【问题标题】:Probleme with my Servlet and @FormDataParam Jersey我的 Servlet 和 @FormDataParam Jersey 有问题
【发布时间】:2015-07-07 13:41:32
【问题描述】:

我在使用 Jersey 时遇到问题。我有一个由两个输入组成的表单,一个是“文件”类型,一个是“文本”类型。

问题是,当我只使用“文件”类型的输入时,一切正常,但是当我添加第二个“文本”类型的输入时,我的 servlet 甚至无法正常启动。

这是我启动 servlet 时遇到的异常:

avr. 28, 2015 5:16:17 PM org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: La servlet /SemRecSysWS a généré une exception "load()"
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 java.lang.String fr.checksem.semrecsys.Gestion.insertSKOS(java.io.InputStream,org.openrdf.rio.RDFFormat) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[text/plain; charset=utf-8], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class fr.checksem.semrecsys.Gestion, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@1a533161]}, definitionMethod=public java.lang.String fr.checksem.semrecsys.Gestion.insertSKOS(java.io.InputStream,org.openrdf.rio.RDFFormat), parameters=[Parameter [type=class java.io.InputStream, source=fichier, defaultValue=null], Parameter [type=class org.openrdf.rio.RDFFormat, source=Format, defaultValue=null]], responseType=class java.lang.String}, nameBindings=[]}']
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:500)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:167)
at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:327)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:324)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:315)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)
at javax.servlet.GenericServlet.init(GenericServlet.java:160)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3954)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Unknown Source)

这是我尝试访问文件和文本的函数

@POST
@Path("/initSKOS")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_PLAIN + ";charset=utf-8")  
public String insertSKOS(@FormDataParam("fichier") InputStream uploadedInputStream, @FormDataParam("Format") RDFFormat format) {
....
}

我已经尝试过每种类型的变量格式,但这并没有改变任何东西。

这是我的 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="SemRecSysWS" version="3.0">
    <display-name>RecWS</display-name>
    <servlet>
        <servlet-name>fr.checksem.semrecsys.TestWS</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>fr.checksem.semrecsys</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>fr.checksem.semrecsys.TestWS</servlet-name>
    <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

我不知道你是否完全理解我的问题,我尽量说清楚。

提前致谢

【问题讨论】:

    标签: java rest jersey multipartform-data jersey-2.0


    【解决方案1】:

    您需要在 web.xml 中注册MultiPartFeature。您可以简单地将 &lt;init-param&gt; 添加到 Jersey servlet

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    
    • 见问题说明here

    • 查看其他配置选项here

    【讨论】:

    • 谢谢,它几乎解决了我的问题!但是,现在,我有另一个异常是 java.lang.ClassNotFoundException: org.glassfish.jersey.internal.inject.AbstractBinder 我知道它与类路径有关,但我找不到问题所在,因为我将 jersey-medi-multipart-2.0-m11.jar 包含到我的项目中。有什么想法吗?
    • here 下载 JAX-RS RI 包。删除您当前拥有的所有 jar,并添加 all 此捆绑包中的 jar。不同目录中有jar。全部添加。然后你需要多部分支持。见this post。获取您当前正在使用的 multipart jar,但 2.17。然后从我链接到的帖子中获取两个罐子。添加所有这些,你应该被设置
    • 使用spring-boot的用户需要在JerseyConfig中注册MultiePartFeature类。
    猜你喜欢
    • 2016-07-14
    • 2011-06-23
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多