Spring Boot 2 обрабатывает данные формы, где json - значения ключей - PullRequest
0 голосов
/ 16 января 2019

У меня есть ситуация, когда мне нужно реализовать метод post для обработки данных формы, где json - значения ключей. Каждый JSON внутренне представляет объект.

Я могу получить json в виде строки через RequestParam, а затем преобразовать в объект, используя Джексона.

    @RequestMapping(value = "/rest/patient", consumes = {"multipart/form-data"},
                                                produces = "application/json", method= RequestMethod.POST)  
    public ResponseEntity<?> savePatient(@RequestParam("patient") String patient ) {
       // convert to Patient instance using Jackson

    }

Есть ли в Spring загрузке отображение из коробки?

1 Ответ

0 голосов
/ 17 января 2019

Я не верю, что есть нестандартное отображение.

Вы можете добавить GenericConvertor в WebConversionService, который использует WebDataBinder.Вам нужно будет перечислить все ваши типы объектов.Что-то вроде следующего:

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.GenericConverter;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.ObjectMapper;

@Component
public class JsonFieldConverter implements GenericConverter {

    @Autowired
    private ObjectMapper objectMapper;

    // Add a new ConvertiblePair for each type you want to convert json 
    // in a field to using the objectMapper. This example has Patient and Doctor
    private static Set<ConvertiblePair> convertibleTypes = new HashSet<>();
    static {
        convertibleTypes.add(new ConvertiblePair(String.class, Patient.class));
        convertibleTypes.add(new ConvertiblePair(String.class, Doctor.class));
    }

    @Override
    public Set<ConvertiblePair> getConvertibleTypes() {
        return convertibleTypes;
    }

    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        try {
            return objectMapper.readValue(source.toString(), targetType.getType());
        } catch (Exception e) {
            // TODO deal with the error.
            return source;
        }

    }
}

И @ControllerAdvice для подключения его к подшивке данных:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.format.WebConversionService;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

@ControllerAdvice
public class JsonFieldConfig {

    @Autowired
    private JsonFieldConverter jsonFieldConverter;

    @InitBinder
    private void bindMyCustomValidator(WebDataBinder binder) {
        ((WebConversionService)binder.getConversionService()).addConverter(jsonFieldConverter);
    }

}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...