Spring POST-запрос неподдерживаемый тип носителя 415

1

У меня есть простой проект Spring 4, основанный на этом учебнике. Я пытаюсь реализовать интерфейс RESTful. Сейчас у меня проблемы с обработкой запроса POST. Когда я пытаюсь опубликовать объект JSON, возникает следующая ошибка:

    {
        "timestamp":1428785473020,
        "status":415,
        "error":"Unsupported Media Type",
        "exception":"org.springframework.web.HttpMediaTypeNotSupportedException",
        "message":"Content type 'application/octet-stream' not supported",
        "path":"/markers/new"
    }

Если я добавлю заголовок Content-Type с использованием значения application/json, у меня есть следующее:

{
    "timestamp":1428785073247,
    "status":400,
    "error":"BadRequest",
    "exception":"org.springframework.http.converter.HttpMessageNotReadableException",
    "message":"Could not read JSON: No suitable constructor found for type 
        [simple type, class org.elsys.internetprogramming.trafficspy.server.Marker]: 
        can not instantiate from JSON object (need to add/enable type information?)
        at [Source: java.io.PushbackInputStream@19e19767; line: 1, column: 2]; 
        nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
        No suitable constructor found for type [simple type, class 
        org.elsys.internetprogramming.trafficspy.server.Marker]: can not 
        instantiate from JSON object (need to add/enable type information?)
        at [Source: java.io.PushbackInputStream@19e19767; line: 1, column: 2]",
    "path":"/markers/new"
}

Вот код: MarkerController.java

@Controller
public class MarkerController {
    private final AtomicLong id = new AtomicLong();
    private Logger logger = Logger.getLogger(MarkerController.class.getName());

    @RequestMapping(value="/markers", method=RequestMethod.GET)
    public @ResponseBody String getMarkers(@RequestParam(value="city", defaultValue="") String city) {
        logger.info("HANDLE GET REQUEST");
        return "{\"id\":\"1\"}";
    }

    @RequestMapping(value="/markers/new", method=RequestMethod.POST)
    public @ResponseBody Marker putMarker(@RequestBody Marker marker) {
        logger.info("HANDLE POST REQUEST");
        return marker;
    }

}

Marker.java

public class Marker {
    private long id;
    private double longitude;
    private double latitude;

    private final String address;

    public Marker(long id, double longitude, double latitude, String address) {
        this.id = id;
        this.longitude = longitude;
        this.latitude = latitude;
        this.address = address;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

Есть ли у вас какие-либо идеи, что вызывает эту проблему и как ее исправить? Спасибо!

Теги:
spring
spring-mvc

2 ответа

1
Лучший ответ

Не найдено подходящего конструктора для типа [простой тип, класс org.elsys.internetprogramming.trafficspy.server.Marker]

Класс Marker не имеет конструктора по умолчанию. Так что у Джексона нет возможности создать экземпляр.

  • 0
    Вот и все. Спасибо!
0

Конструктор Marker должен быть аннотирован с помощью @JsonCreator.

Вам нужно отправить заголовок Content-Type (как в вашем втором примере), иначе весна не знает, что вы отправляете json.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню