406 Spring MVC Json - не могу вернуть объект

406
12 июня 2017, 20:45

Столкнулся с проблемой, не могу вернуть объект в REST-Controller (метод addUser). Вылазит ошибка HTTP Status 406 -The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

Необходимо вернуть в виде:

{ "id": "Id generated by the back-end",
"firstName": "Some first name",
"lastName": "The last name",
"userName": "The user name" }

Буду благодарен за помощь!

Conntroller class

    @Controller
public class UserControllerImpl implements UserController {
    private UserRepository repository;
    public UserControllerImpl() {
    }
    @Autowired
    public UserControllerImpl(UserRepository repository) {
        this.repository = repository;
    }
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String welcomeFile() {
        return "index";
    }
    @RequestMapping(value = "userservice/addUser", method = RequestMethod.GET, headers="Accept=text/html")
    @Override
    public String addUser(ModelMap model) {
        return "userservice/addUser";
    }

    @RequestMapping(value = "userservice/addUser", method = RequestMethod.POST)
    @Override
    public @ResponseBody User addUser(@RequestBody User user) {
        User user1 = this.repository.createUser(user);
        return user1;
    }
}

addUser.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
    <title>Add User</title> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.js"></script> 
</head> 
<body> 
<script> 
    $(document).ready(function () { 
        $("#register").submit(function (e) { 
            var user = { 
                firstName: $("#firstName").val(), 
                lastName: $("#lastName").val(), 
                userName: $("#userName").val(), 
                plainTextPassword: $("#plainTextPassword").val() 
            }; 
 
            $.ajax({ 
                headers: { 
                    'Accept': 'application/json', 
                    'Content-Type': 'application/json' 
                }, 
                url: "addUser", 
                contentType: 'application/json', 
                data: JSON.stringify(user), 
                type: 'POST', 
                success: function (data) { 
                    location.reload(); 
                }, 
                error: function (xhr, status, errorThrown) { 
                    alert('A user with the given username already exists fwefwefewfewf' + status + ". " + errorThrown); 
                } 
            }); 
            e.preventDefault(); 
        }); 
    }); 
     
//    function funcSuccess(data) { 
//        $("#id").text(data.id); 
//        $("#firstName").text(data.firstName); 
//        $("#lastName").text(data.lastName); 
//        $("#userName").text(data.userName); 
//    } 
</script> 
 
<form method="post" id="register" action="addUser" commandName="user"> 
    <table border="1" cellpadding="8" cellspacing="0"> 
        <tr> 
            <td>First Name:</td> 
            <td><input type="text" name="firstName" id="firstName" value=""/></td> 
        </tr> 
        <tr> 
            <td>Last Name:</td> 
            <td><input type="text" name="lastName" id="lastName" value=""/></td> 
        </tr> 
        <tr> 
            <td>User Name:</td> 
            <td><input type="text" name="userName" id="userName" value=""/></td> 
        </tr> 
        <tr> 
            <td>Password:</td> 
            <td><input type="text" name="plainTextPassword" id="plainTextPassword" value=""/></td> 
        </tr> 
        <tr> 
            <td colspan="2"><input type="submit" id="registerUserSubmit" value="Registration"/></td> 
        </tr> 
    </table> 
</form> 
 
</body> 
</html>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan">
            <array>
                <value>com.temaprof.app.model</value>
            </array>
        </property>
        <property name="hibernateProperties">
            <value>hibernate.dialect=org.hibernate.dialect.PostgreSQL94Dialect</value>
        </property>
    </bean>
</beans>

Результат выполнения

После нажатия кнопки

index.jsp

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Manager</title>
</head>
<body>
<div>
    <h1>User Manager</h1>
</div>
<a href="userservice/addUser">Registration</a>
</body>
</html>

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>CRUD</groupId>
    <artifactId>CRUD</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Simple REST by temaprof</name>
    <properties>
        <spring.version>4.2.2.RELEASE</spring.version>
        <hibernate.version>5.0.3.Final</hibernate.version>
        <!--DB-->
        <postgresql.version>9.4.1211</postgresql.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--DataBase-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>1.10.2-1</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>project</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

despatcher-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <mvc:annotation-driven />
    <context:component-scan base-package="com.temaprof.app.controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
Answer 1

Убери consumes = {"application/json"} у GET метода addUser. Какое отношение json имеет к этому методу? Вместо этого использу headers="Accept=text/html".

Если класс помечен аннотацией @RestController, то все методы яляются @ResponseBody и не могут возвращать JSP страницы.

Чтобы использовать аннтотации @RequestBody/@ResponseBody нужно добавить тег <mvc:annotation-driven /> в dispatcher-servlet.xml. Если не добавить тег, то это может вызывать HTTP ошибку 415 Unsupported Media Type

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method

Лог tomcat

org.springframework.web.servlet.mvc.support.DefaultHandlerEx‌​ceptionResolver.logE‌​xception Handler execution resulted in exception: Content type 'application/json' not supported

Событие submit относится к форме, а не кнопке.

Чтобы использовать библиотеку jQuery ($()), ее нужно сначала подключить – Как подключить jQuery к проекту? .

READ ALSO
Как правильно работать с фрагментами android

Как правильно работать с фрагментами android

Всем привет, сейчас пишу программу с большим количеством фрагментов и с одной активитиСуть в том, что в активити постоянно меняются местами...

285
Получить коды символов в строке

Получить коды символов в строке

Как у переменной типа string по индексу получить коды символов? Понятно что обращаться в цикле к индексуКак именно получить код и какой тип данных...

208
Скачать файл по прямой ссылке

Скачать файл по прямой ссылке

В android приложении по нажатию на кнопку должна начаться загрузка файла по прямой ссылке на загрузку файла( при открытии сразу предлагает сохранить...

632
Jenkins+(nexus\maven) через SSL

Jenkins+(nexus\maven) через SSL

Доброго времени сутокЕсть несколько Docker контейнеров с Jenkins, Nexus и Maven

257