当前位置: 首页 > 知识库问答 >
问题:

mvc:注释驱动无法解决406错误

方焱
2023-03-14

我正试图为Spring编写一个Junit测试用例,经过大量阅读,我得到了一个返回text/plain的方法的所有工作。当我试图返回application/json时,遇到了问题。

关于SO的共识似乎是:使用mvc:注释驱动。我尝试了这个(通过创建spring-web-servlet.xml如下所示根据这里。然而,这并没有解决我的问题。有人知道我还做错了什么吗?

SpringWebservlet。xml(在WEB-INF文件夹中)

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <mvc:resources mapping="/resources/**" location="/resources/" />

    <mvc:annotation-driven />

</beans>

有问题的方法(在HelloService类中)

@GET
@RequestMapping("/json2")
@Produces({"application/json"})
@ResponseBody
public Object getUserInfoJSON(@RequestParam(value="p",defaultValue="0") Integer userId){
    try (Connection conn = conn()) {
        String query = "SELECT * FROM pulse.customer WHERE userId = ?";
        PreparedStatement preparedStmt = conn.prepareStatement(query);
        preparedStmt.setInt(1, userId);
        ResultSet rs=preparedStmt.executeQuery();
        if(rs.next())
            return Json.createObjectBuilder().add("login name", rs.getString("loginName"));

            return Json.createObjectBuilder().add("login name", "shit broke yo!!!");
    }
    catch(SQLException s){
        return "sql exception:"+s.toString();
    }
    catch (NoResultException nre) {
        //throw new UserNotFoundException(userId);
        return "UserNotFoundException";
    } catch (PersistenceException e) {
        //throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
        return "WebApplicationException";
    }
}

Junit测试方法(接受字符串的版本工作得非常好)

   @Test
    public void testUserInfoResponseJSON() throws Exception{

      MvcResult result=mockMvc.perform(get("/helloservice/json2?p=103")
              .contentType(MediaType.APPLICATION_JSON))
              .andExpect(status().isOk())
              .andExpect(content().contentTypeCompatibleWith("application/json"))
              .andReturn();

      String content = result.getResponse().getContentAsString();

      assertNotNull(content,"{login name:jbray}");
   } 

如果需要,这是我的pom。xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>1.5.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
        </dependency>
        <!-- Adding RESTEasy support to Bean Validations -->
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-validator-provider-11</artifactId>
            <version>3.1.4.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-links -->
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-links</artifactId>
            <version>3.1.4.Final</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.6.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.cache</groupId>
          <artifactId>cache-api</artifactId>
        </dependency>
                      <!--SPRING-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId> 
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.paypal.springboot</groupId>
            <artifactId>resteasy-spring-boot-starter</artifactId>
            <version>2.3.3-RELEASE</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId> 
        </dependency>

        <!--JUNIT-->
        <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.0.RELEASE</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.json</artifactId>
  <version>1.0.4</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.1.1</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<dependency>
     <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <scope>test</scope>
 </dependency>

    </dependencies>

共有1个答案

慕学海
2023-03-14

我详细查看了您的依赖关系和代码,发现您正在使用Glassfish的JSR353的提供者实现。这些类是org。玻璃鱼。json。JsonObjectBuilderImpl$JsonObjectImpl,org。玻璃鱼。json。JsonStringImpl和org。玻璃鱼。json。JsonNumberImpl和javax。json。JsonValue$3(值FALSE的匿名类)

您需要更改以下代码

return Json.createObjectBuilder().add("login name", rs.getString("loginName"));

return Json.createObjectBuilder().add("login name", "shit broke yo!!!");

return Json.createObjectBuilder().add("login name", rs.getString("loginName")).build().toString();

return Json.createObjectBuilder().add("login name", "shit broke yo!!!").build().toString();

并将返回类型改为getUserInfoJSON()方法为String。有关JSR353类及其到ObjectMapper的映射的详细说明,请访问https://stackoverflow.com/a/19205116/3530898

 类似资料:
  • 现在我正在尝试从git运行克隆应用程序https://github.com/frinder/frinder-app但问题是该应用程序制作了很长时间,所以应该改变bulid.gradle 但是当我尝试相同的同步实现“com.android.支持:动画矢量可绘制:28.0.0”,但如果我删除它,请继续向我显示错误28.0.0它显示如下 但我不知道是什么造成了不完全相同的版本 这是应用程序build.g

  • 你好,朋友,我正在开发基于spring(4.0.3)和hibernate(4.3.6)的应用程序。在会话工厂中保存任何对象时,我遇到以下错误: 下面是我在application-context.xml中使用的条目 还有一件事我想带到这里,如果我在事务管理器属性中使用了任何值,而不是实际的transactionManager作为bean引用,那么这不是抛出错误。所以我认为它没有参考价值<请帮帮我!!

  • 我希望在我遇到的这个错误代码上得到一些帮助。 语境: 我工作的公司使用GSUITE产品。 我的团队有自己的云项目设置。 谷歌硬盘不是个人硬盘。 我们使用Airflow每天/每周/每月刷新BigQuery表。 我遵循了这些解决方案 拒绝访问:获取驱动器凭据时拒绝权限 使用带有Google工作表的BigQueryAPI时出现“全局文件模式时遇到错误”错误 还引用了https://cloud.googl

  • 我无法在我的Kotlin Spring Boot应用程序中正确地注入应用程序属性。在我的文件中定义并随后在文件中引用的属性(在resources->META-INF下)没有正确地添加到bean表达式上下文中。使用,当我将鼠标悬停在该属性上时,我会看到错误。试图运行应用程序(将配置属性值construction-inject到类中)会导致通过构造函数参数表示的

  • 我试图构建我的第一个Spring MVC项目,我一直在阅读大量的教程,观看视频等...但我面临着这个问题: 说明服务器遇到一个内部错误,使其无法满足此请求。 例外 servletException:servlet的servlet.init()springDispatcherServlet抛出异常

  • 我最近从JMeter3.2更新到了JMeter4.0。在jmx文件中,我有查询要执行,它在JMeter3.2中运行良好。但是jmx文件失败,在jmeter 4.0中出现错误“响应消息:java.sql.sqlException:不能加载JDBC驱动程序类'com.microsoft.sqlserver.JDBC.sqlserverdriver'”。请帮助我解决这个问题。