Jackson 2 и Конвертация java объекта в json

545
22 января 2017, 14:22

Добрый день. Пытаюсь отправить объект из спринг контроллера на ангуляр и на вьюшку:

pom:

<?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>LT</groupId>
<artifactId>LT</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
    <java.version>1.8</java.version>
    <spring.core>4.1.6.RELEASE</spring.core>
    <spring.mvc>4.1.6.RELEASE</spring.mvc>
    <javax.servlet>3.0.1</javax.servlet>
    <postgresVersion>9.1-901-1.jdbc4</postgresVersion>
    <junit.version>4.11</junit.version>
    <javax.servlet>3.0.1</javax.servlet>
    <jackson.version>1.9.10</jackson.version>
    <spring.securiry>4.0.1.RELEASE</spring.securiry>
    <mail.version>1.4</mail.version>
    <postgres.version>9.1-901-1.jdbc4</postgres.version>
</properties>
<dependencies>
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>
    <!-- SPRING -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.mvc}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>${spring.securiry}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>${spring.securiry}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>${spring.securiry}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.1.6.RELEASE</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <!-- END SPRING -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${javax.servlet}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains</groupId>
        <artifactId>annotations</artifactId>
        <version>15.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.4</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>
</dependencies>
<build>
    <finalName>LT</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

Контролллер:

@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/getMessage", method = RequestMethod.GET)
public String getMessage() throws JsonProcessingException {
   //ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
    //String json = ow.writeValueAsString("Hello World!!");
    //return json;
    return "Hello World!!";
}

}

ангуляр-сервис:

function userService(http) {
var service = {};
service.getAllRoles = function () {
    console.log("Getting Message from back-end");
    return http({
        method: 'GET',
        url: '/user/getMessage'
    })
};
    return service;
}
userApp.service('userService', ['$http', userService]);

ангуляр-контроллер

function userController($scope, $http, userService) {
   userService.getAllRoles().success(function (data) {
    $scope.stroka = data;
    console.log(data);
}, function error() {
    console.log("error");
});
}
userApp.controller('userController', ['$scope', '$http', 'userService',     userController]);

в результате при загрузке страницы получаю:

SyntaxError: Unexpected token H in JSON at position 0
at JSON.parse (<anonymous>)
at xc (angular.min.js:16)
at dc (angular.min.js:91)
at angular.min.js:92
at q (angular.min.js:7)
at gd (angular.min.js:92)
at f (angular.min.js:94)
at angular.min.js:131
at m.$eval (angular.min.js:145)
at m.$digest (angular.min.js:142)

Если в контроллере отправлять объект таким образом

 ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
 String json = ow.writeValueAsString("Hello World!!");
 return json;

всё работает, но если отправлять просто джава объект - ошибка. Раньше, перед отправкой, я никаких манипуляций с джава объектами не делал, и всё работало (я считал что либа jackson находится в класспассе и она автоматов конвертировала всё в json), но сейчас нет. Может кто-то подсказать, что нужно поменять чтоб объекты автоматический конвертировались в json?

UPD Не понимаю почему, но такая проблема возникает только когда пытаюсь отправить символьную строку.. При попытке отправить сущность, или даже строку вида "12345" всё работает..

Answer 1

Все просто. Начнем с трейса на стороне js.

SyntaxError: Unexpected token H in JSON at position 0
at JSON.parse (<anonymous>)

Браузер явно указывает, что первый символ в полученной строке - H, и парсеру JSON это не нравится. Потому что спецификация JSON предусматривает соблюдение определенного синтаксиса. И все текстовые строки, кроме true, false и null согласно ей должны быть завернуты в двойные кавычки.

Обратите внимание, что когда вы возвращаете из контроллера просто строку

return "Hello World!!";

тело HTTP-ответа будет выглядеть так:

Hello World!!

Если же вы прогоните строчку через ow.writeValueAsString, то Jackson преобразует исходное значение в валидное JSON-выражение, и HTTP-ответ уже будет содержать другую строку:

"Hello World!!"
READ ALSO
Что такое Null Pointer Exception и как его исправить?

Что такое Null Pointer Exception и как его исправить?

Что из себя представляет исключение Null Pointer Exception (javalang

441
jquery and html select

jquery and html select

Доброго времени суток всем, столкнулся с такой проблемой есть одно поле ввода input id="siF3" и виподаюши список select id="country" в списке несколько стран...

374
Помощь с Semantic UI

Помощь с Semantic UI

Доброго времени суток, подскажите пожалуйста почему может не работать выпадающий список Compact Dropdown если сделать append всего блока

373
Отступы от иконок

Отступы от иконок

Добавил напротив иконок ссылки,добавил отступы иконкам в ,но ссылки идут не ровно в столбецПолагаю из за разного размера иконок

330