Jersey应用程序 - 启动时出错

时间:2016-07-12 11:30:54

标签: java spring jersey multipartform-data

我有一个用于fileupload的Jersey应用程序。在启动期间或在我的应用程序中上传文件时,我在WebSphere跟踪日志中遇到以下错误。

错误:

The registered message body writers compatible with the MIME media type are:
application/octet-stream ->
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
  com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General

[7/12/16 13:26:16:263 CEST] 0000034e ContainerResp E   Mapped exception to response: 500 (Internal Server Error)
                                 javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.sun.proxy.$Proxy553, and Java type interface javax.servlet.http.HttpServletResponse, and MIME media type application/octet-stream was not found.

        at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:284)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1510)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)

Web.xml中

<servlet>
        <servlet-name>my-service</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>my.app.service</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

的pom.xml

<dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.19</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>1.19</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-multipart</artifactId>
            <version>1.19</version>
        </dependency>

我不确定这里有什么问题?请帮忙。

修改:1

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.jersey.core.header.FormDataContentDisposition;

@Autowired
private ObjectMapper objectMapper;

@POST
@Path("/upload")
@Consumes({MediaType.MULTIPART_FORM_DATA})
public HttpServletResponse attachDocument(@Context HttpServletRequest request,
                                          @Context HttpServletResponse response,
                                          @FormDataParam("file") InputStream fileInputStream,
                                          @FormDataParam("file") FormDataContentDisposition filedata) {

    String webServiceResponse = //call webservice here to store document
    objectMapper.writeValue(response.getOutputStream(), webServiceResponse);
}

1 个答案:

答案 0 :(得分:0)

您不希望从jaxrs资源方法返回HttpServletResponse。在这种情况下,这是错误日志所说的内容:

  

Java类com.sun.proxy的消息体编写器。$ Proxy553和Java类型接口javax.servlet.http.HttpServletResponse

接口javax.servlet.http.HttpServletResponse(由@Context注入)由代理类com.sun.proxy.$Proxy553实现。在球衣中,它没有MessageBodyWriter(除非你添加一个,这不是你想要做的)。

默认情况下,球衣中有MessageBodyWriters串,主要是在jaxrs specification中命名的第4.2.4节。您可能想要返回javax.ws.rs.core.Response,例如:

return Response.ok(entity).build();