Поддержка немецкого языка / специальных символов в веб-сервисе данных формы отдыха - PullRequest
0 голосов
/ 07 мая 2018

Я сейчас занимаюсь разработкой небольшого проекта в Angular JS + Java, где пользователь регистрирует свою информацию в своем профиле с помощью rest webservice. Все работает нормально, кроме специального символа (Ä Ö Ü ä ö).

Java:

@POST
@Path("add_employee")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response addEmployee(MultipartFormDataInput input) {
    try {
        Map<String, List<InputPart>> formDataMap = input.getFormDataMap();
        if (formDataMap != null && !formDataMap.isEmpty()) {
            InputPart inputPart = formDataMap.get("EmployeeProxy").get(0);
            ObjectMapper mapper = new ObjectMapper();

            //receiving wrong json below=>
            EmployeeProxy admbo = mapper.readValue(inputPart.getBodyAsString(), EmployeeProxy.class); 

            List<InputPart> profilePic = formDataMap.get("profilePic");
            .
            .
            .
        } else {
            return Response.status(Response.Status.NOT_FOUND).build();
        }
    } catch (Exception ex) {
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
    }
}

Угловой JS:

var fd = new FormData();
fd.append('EmployeeProxy', angular.copy(JSON.stringify($scope.empInfo)));
fd.append('profilePic', $scope.myFile);

$http.post(Server.url + 'add_employee', fd, {
    transformRequest: angular.identity,
    headers: {'Content-Type': undefined}
}).then(function (response) {
});

Отправка Json: {"empName": "Ä Ö Ü ä ö", "empSurname": "XYZ", "emailId": "Abc@gmail.com"}

Получение Json: {"empName": " ", "empSameame": "XYZ", "emailId": "abc@gmail.com"}

Пожалуйста, найдите ниже изображение для информации заголовка запроса:

enter image description here

Это работает нормально, если я использую APPLICATION_JSON без MULTIPART_FORM_DATA.

1 Ответ

0 голосов
/ 07 мая 2018

Если ваш заголовок Content-Type равен undefined, RestEasy не может идентифицировать используемую кодировку и откатится до значения по умолчанию (us-ascii).

См. Также: Перезаписать резервный тип содержимого по умолчанию для составных сообщений

Редактировать после прочтения этого: это должно быть составное тело, которое задает тип содержимого для того, чтобы RestEasy анализировал отдельные строки. В документации FormData это можно сделать следующим образом:

Угловой JS:

fd.append('EmployeeProxy', new Blob([angular.copy(JSON.stringify($scope.empInfo))], { type: "text/plain; charset=iso-8859-1"}));

Java:

String json = IOUtils.toString(inputPart.getBody(InputStream.class, null), StandardCharsets.UTF_8);
EmployeeProxy admbo = mapper.readValue(json, EmployeeProxy.class); 
...