Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Could not write JSON: JsonObject; nested exception is com.fasterxml.jackson.databind.JsonMappingException: JsonObject

Spring boot 2.5

    @PostMapping("/cart/product")
    public Response addProduct(@RequestBody Map<String, Object> payloadMap) {
        logger.info("addProduct: payloadMap: " + payloadMap);
        String userName = payloadMap.get("user_name").toString();
        final Product product = new ObjectMapper().convertValue(payloadMap.get("product"), Product.class);
        int quantity = (int) payloadMap.get("quantity");
        Cart findCart = cartRepository.findByUsername(userName);
        if (findCart == null) {
            Cart cart = new Cart();
            cart.setCreated(new Date());
            cart.setUsername(userName);
            cart.addProduct(product, quantity);
            cartRepository.save(cart);
            logger.info("addProduct: success_add_product_to_new_cart: " + cart);
            return ResponseService.getSuccessResponse(GsonUtil.gson.toJsonTree(cart));
        } else {
            findCart.addProduct(product, quantity);
            logger.info("addProduct: before_save_exist_cart: " + findCart);
            cartRepository.save(findCart);
            logger.info("addProduct: success_add_product_to_exist_cart: " + findCart);
            return ResponseService.getSuccessResponse(GsonUtil.gson.toJsonTree(findCart));
        }
    }


public class ResponseService {
    private static final int SUCCESS_CODE = 0;
    private static final String SUCCESS_MESSAGE = "Success";
    private static final int ERROR_CODE = -1;

    private static Logger logger = LogManager.getLogger(ResponseService.class);

    public static Response getSuccessResponse(JsonElement body) {
        Response response = new Response(SUCCESS_CODE, SUCCESS_MESSAGE, body);
        logger.info("getSuccessResponse: response = " + response);
        return response;
    }


import com.google.gson.JsonElement;

public class Response {
    private int code;
    private String message;
    private JsonElement body;

    public Response(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public Response(int code, String message, JsonElement body) {
        this.code = code;
        this.message = message;
        this.body = body;
    }

But I get error when try to return response:

2020-04-12 12:02:18.825  INFO 9584 --- [nio-8092-exec-1] r.o.s.e.controllers.CartController       : addProduct: success_add_product_to_new_cart: Cart{id=130, username='[email protected]', created=Sun Apr 12 12:02:18 EEST 2020, updated=null, productEntities=[
ProductEntity{id=131, created=Sun Apr 12 12:02:18 EEST 2020, updated=null, quantity=1, orders=null, product=
Product{id=132, name='product name', description='product description', created=Tue Mar 10 22:34:15 EET 2020, updated=null, price=11.15, currency='EUR', images=[http://www.gravatar.com/avatar/44444?s=200x200&d=identicon, http://www.gravatar.com/avatar/33333?s=200x200&d=identicon]}}], totalAmount=11.15, currency='EUR'}
2020-04-12 12:02:18.836  INFO 9584 --- [nio-8092-exec-1] r.o.s.e.service.ResponseService          : getSuccessResponse: response = Response{code = 0, message = 'Success', body = '{"id":130,"username":"[email protected]","created":"Apr 12, 2020, 12:02:18 PM","productEntities":[{"id":131,"created":"Apr 12, 2020, 12:02:18 PM","quantity":1,"product":{"id":132,"name":"product name","description":"product description","created":"Mar 10, 2020, 10:34:15 PM","price":11.15,"currency":"EUR","images":["http://www.gravatar.com/avatar/44444?s=200x200&d=identicon","http://www.gravatar.com/avatar/33333?s=200x200&d=identicon"]}}],"totalAmount":11.15,"currency":"EUR"}'}
2020-04-12 12:02:18.861  WARN 9584 --- [nio-8092-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: JsonObject; nested exception is com.fasterxml.jackson.databind.JsonMappingException: JsonObject (through reference chain: ru.otus.software_architect.eshop_orders.api.Response["body"]->com.google.gson.JsonObject["asBoolean"])]
like image 518
Alexei Avatar asked Aug 25 '26 09:08

Alexei


1 Answers

Spring Boot uses jackson by default to serialize json. In Response object you have field JsonElement body. It is object from gson package and jackson don't know how to serialize that.

Solution: add property (in the application.properties file) to use gson instead of jackson. Note that Spring Boot version is important.

Spring Boot >= 2.3.0.RELEASE: spring.mvc.converters.preferred-json-mapper=gson

Spring Boot < 2.3.0.RELEASE: spring.http.converters.preferred-json-mapper=gson

More informations:

Configuring Spring Boot to use Gson instead of Jackson

Spring Boot 2.3 Release Notes

like image 165
Robert Jakubowski Avatar answered Aug 28 '26 08:08

Robert Jakubowski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!