【问题标题】:Spring boot - gson singleton?春季启动 - gson 单例?
【发布时间】:2023-03-17 12:30:01
【问题描述】:

我的应用程序当前运行的是 Gson 而不是 jackson,如何使用 gson 解析传入的表单提交?

我目前得到

2015-10-26 14:14:59.027 ERROR 12876 --- [nio-8080-exec-1] com.exp.controllers.UserController:Bean 对象不能为空;嵌套异常是 java.lang.IllegalArgumentException: Bean object must not be null

@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;
    }

}

【问题讨论】:

  • 你为什么要手动映射所有这些?如果您只有适当的转换器(如果 Gson 在类路径上,Spring Boot 应该为您添加),您可以将 @ModelAttribute User user 声明为参数,所有这些都是自动的。
  • 当您将 GsonHttp 更改为使用 @Component 注释时会发生什么???像 GsonHttp 这样的泛型类也经常被放在泛型包中。但要自动装配,它需要位于主应用程序配置的子包中。

标签: java spring spring-mvc spring-boot


【解决方案1】:

当您尝试保存空对象时,存储库会抛出“Bean 对象不得为空”。

userDao.save(user) //User is null

您的对象为空的原因是因为您无法在不添加 @RequestBody 的情况下获取 json,因此请更改您的 json 参数以具有此注释

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

在 Spring Boot 中设置 GSON

默认情况下,Jackson 是默认解析器,正如您所解释的,用 GSON 替换它就这么简单。

src/main/resources/application.properties

spring.http.converters.preferred-json-mapper.gson=true

这需要在类路径上使用 GSON,就像您显然所做的那样。

然后重写你的 create post 方法

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

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

-

Gson 特定配置 - 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 在类路径上而 jackson 不在,则它使用 GSON(例如,如果您将其从 Maven 或 Gradle 中排除)

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2015-04-18
    • 2017-06-24
    • 2015-08-22
    • 2015-09-18
    • 2015-03-20
    • 2018-01-24
    • 2016-08-22
    • 2016-07-22
    相关资源
    最近更新 更多