java - 找不到媒体类型 = 文本/html 的 MessageBodyWriter 但适用于 JSON

标签 java rest maven model-view-controller jersey

问题是,每当我尝试生成 JSON 以外的任何媒体类型的响应时,我都会收到“MessageBodyWriter”未找到错误。 但是响应对于 Application_JSON 输出工作正常。 我在我的 Maven POM 中使用了几个依赖项,所以 MessageBodyWriter 可能被覆盖或者可能只针对它包含的 JSON。

这里是 pom 依赖项 -

<dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.2-1003-jdbc4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
        </dependency>
        <!-- http://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.22.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.22.1</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.22.1</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.15</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-sse</artifactId>
            <version>2.15</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-jaxb</artifactId>
            <version>2.17</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-mvc</artifactId>
            <version>2.5.1</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/javax.ws.rs/jsr311-api -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
        </dependency>



        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.6.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl </artifactId>
            <version>1.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>1.4</version>
        </dependency>

    </dependencies>

我使用的示例 Java 类是 -

package com.va;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.glassfish.jersey.server.mvc.Viewable;

@Path("orders")
public class OrderView{

    @GET
    @Produces(MediaType.TEXT_HTML)
    public Viewable index() {
        return new Viewable("index");
    }

}

另外,我将 index.htm 文件保存在 webapp 文件夹中。 web.xml 的配置如下 -

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.va</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/webapp</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.mvc.jsp.JspMvcFeature</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <param-value>/(webapp)/.*</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

关于访问 URL localhost:8080/myapp/orders 我收到 HTTP 500 错误和控制台错误

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=text/html, type=class org.glassfish.jersey.server.mvc.Viewable, genericType=class org.glassfish.jersey.server.mvc.Viewable.

请指导我是什么问题。提前致谢。:)

最佳答案

这里有几点需要注意,在使用 jersey mvc 模板时,您应该使用 servlet 过滤器而不是 serlvet。此外,您的一些 init 参数引用 Jersey 1,应更改为等效的 Jersey 2。更多信息 Jersey MVC Template

更新了 web.xml。试一试。

    <filter>
    <filter-name>Jersey REST Service</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.va</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.mvc.templateBasePath</param-name>
        <param-value>/webapp</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.mvc.jsp.JspMvcFeature</param-value>
    </init-param>
    <init-param>
    <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
    <param-value>true</param-value>
</init-param>
    <load-on-startup>1</load-on-startup>
  </filter>

  <filter-mapping>
    <filter-name>Jersey REST Service</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

关于java - 找不到媒体类型 = 文本/html 的 MessageBodyWriter 但适用于 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37553719/

相关文章:

java - 使用 JSP 呈现时,西类牙字符显示为符号

rest - swagger ui 中重复的 bool 值

c# - 无法使用 REST 在 SharePoint 2013 中重命名文件夹

maven-2 - Maven 2 <resources> 继承(父-> 子项目)

java - 如何使用maven生成代码并打包,无需依赖?

Java - 最大堆中整数的非字典序倒序

Java,如何在纯java中使用表达式语言

java - lombok @RequiredArgsConstructor 如何向构造函数 spring boot 注入(inject)值

web-services - 建立一个大规模的网络服务

java - spring-boot: 运行多模块 Maven 项目