2015-01-29 5 views
0

Цель: сделать общую реализацию для запросов PATCH с использованием API reflextion.Соедините вход JSON с java.util.Map, используя Spring MVC и Jackson

Контекст: ранее был запрос POST (вход JSON: полный объект, все поля). Теперь я хочу заменить его запросом PATCH (вход JSON: частичный объект, только обновленные поля). Поэтому мне нужно заменить @RequestBody Entity entity чем-то вроде @RequestBody Map<String, Object> entityFieldValues.

вход в формате JSON:

{ 
    "active": false 
} 

Что я пробовал:

@RequestMapping(value = "/{entityId}", method = RequestMethod.PATCH) 
public void patch(@PathVariable("entityId") final Long entityId, @RequestBody Map<String, Object> fieldValues) { 
    // load entity from DB and update values using reflection (BeanUtils) 
    service.patch(entityId, fieldValues); 
} 

Это не работает. Когда я тестирую этот контроллер с помощью POSTMAN, я столкнулся с ошибкой 501 HTTP, которая не реализована. На данный момент я использую следующий обходной путь:

@RequestMapping(value = "/{entityId}", method = RequestMethod.PATCH) 
public void tooglePublished(@PathVariable("entityId") final Long entityId, @RequestBody String body) throws JsonParseException, JsonMappingException, IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    // TODO : make it work using something like: @RequestBody Map<String, String> fieldValues 
    Map<String, Object> fieldValues = mapper.readValue(body,new TypeReference<Map<String, Object>>() {}); 
    // load entity from DB and update values using reflection (BeanUtils) 
    service.patch(entityId, fieldValues); 
} 

ли кто-нибудь знает, как я могу заставить его работать с использованием Spring MVC аннотаций?

Весна 4.1.1.RELEASE Джексон 1.9.13

Благодаря

ответ

0

Это не имеет смысла. 501 not implemented означает, что веб-сервер вообще не поддерживает метод (PATCH), поэтому второй пример тоже потерпит неудачу. Возможно, вы выбрали неправильный метод в Postman.

Для того, чтобы использовать @RequestBody Map<String, Object>, вам также необходимо отправить правильный заголовок Content-Type.