2015-10-26 3 views
0

Мое приложение в настоящее время запускает Gson вместо jackson, как использовать gson для анализа входящей формы submit?Весенняя обувь - gson singleton?

я в настоящее время получить

2015-10-26 14: 14: 59,027 ОШИБКА 12876 --- [NiO-8080-Exec-1] com.exp.controllers.UserController: объект Bean не должен быть ноль; вложенное исключение java.lang.IllegalArgumentException: объект Bean не должен быть пустым

@RestController 
public class UserController { 

    @Autowired 
    private UserDao userDao; 

    @Autowired 
    private GsonHttp gsonHttp; 

    private final Logger log = LoggerFactory.getLogger(this.getClass()); 

    @RequestMapping(value="/createPOST", method = RequestMethod.POST) 
    @ResponseBody 
    public ResponseData createPOST(String json) { 
    User user = null; 
    try { 
     user = gsonHttp.getGson().fromJson(json, User.class); 
     userDao.save(user); 
    } 
    catch (Exception ex) { 
     log.error(ex.getMessage()); 
     return new ResponseData(false, Arrays.asList("Error with user creation.")); 
    } 
    return new ResponseData(true, Arrays.asList(user)); 
    } 
} 

с этим:

@Repository 
public class GsonHttp { 

    private Gson gson; 

    public GsonHttp(){ 
     this.gson = new Gson(); 
    } 

    public Gson getGson() { 
     return gson; 
    } 

    public void setGson(Gson gson) { 
     this.gson = gson; 
    } 

} 
+0

Почему вы пытаетесь сопоставить все это вручную? Если у вас есть подходящие конвертеры (которые Spring Boot должен добавить для вас, если Gson находится в пути к классам), вы можете объявить пользователя '@ModelAttribute User user 'как параметр, и все это автоматически. – chrylis

+0

Что происходит, когда вы меняете GsonHttp на аннотацию @Component? Также часто такие общие классы, как GsonHttp, помещаются в общие пакеты. Но для того, чтобы быть автообновленным, он должен находиться в субпакете вашей основной конфигурации приложения. – Zergleb

ответ

4

«объект Bean не должен быть пустым» выбрасывается из хранилища, когда вы пытаетесь для сохранения нулевого объекта.

userDao.save(user) //User is null 

Причина ваш объект является пустым, потому что вы не можете получить JSON без добавления @RequestBody так изменить параметр JSon, чтобы иметь эту аннотацию

public String createPost(@RequestBody String json) { //Added @RequestBody 

Настройка GSON весной загрузки

По умолчанию Джексон является парсером по умолчанию, как вы объяснили, чтобы заменить его на GSON, это так просто.

SRC/основные/ресурсы/application.properties

spring.http.converters.preferred-JSON-mapper.gson = истинный

Это требует GSON на пути к классам, как вы по-видимому, ,

Затем перепишите создать почтовый метод, так

@RequestMapping(value="/createPOST", method = RequestMethod.POST) 
    @ResponseBody 
    public ResponseData createPOST(@RequestBody User user) { 
    userDao.save(user); 
    return new ResponseData(true, Arrays.asList(user)); 
    } 

Base HTTPMessageConverterClass - https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfiguration.java

-

Gson Specific Config - https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/GsonHttpMessageConvertersConfiguration.java

Обязательно обратите особое внимание на класс PreferGsonOrMissingJacksonCondition в этом последнем источнике. Он использует GSON, если gson настроен на то, чтобы быть предпочтительным, или если Gson находится на пути к классу, а jackson - нет (например, если вы исключили его из Maven или Gradle)

+0

@RequestBody сделал это, спасибо огромное! –

+0

Ты знаешь, что ты избил меня.Я собирался сказать, что я не помню/@ RequestBody, являющегося ther, и это проблема (ошибка, вызванная репозиторием при попытке сохранить null). Но рад, что мой пост помог мне изменить начало, чтобы подчеркнуть, что решение/@ RequestBody является решением. – Zergleb

Смежные вопросы