Микронавт JSON post strip Котировки - PullRequest
0 голосов
/ 02 января 2019

В контроллере Micronaut разбор почтового запроса с использованием объекта JSON.Я ожидаю, что он не будет включать в себя кавычки, но он вставляется в базу данных.

Публикуем так:

curl -X POST --header "Content-Type: application/json" -d '{"bookid":3,"name":"C++"}'  http://localhost:8880/book/save

Сохраняем так:

String bookid=JSON?.bookid
  String name=JSON?.name
def b =bookService.save(bookid,name

в базе данных Хранится так:

+--------+-------+
| bookid | name  |
+--------+-------+
| 3      | "C++" |
+--------+-------+

Я ожидаю, что название книги просто C++

Спасибо, SR

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Я знаю, что немного опоздал, но я долго искал решение и ничего не нашел.После многих усилий я обнаружил, что отправка Джексона «Object» с «@BODY» не помогает, когда я изменил тип на «String», он работал для меня.

Вот мой код

def save(@Body String JSON){

    def result = [:]
    ObjectMapper objectMapper = new ObjectMapper();

    //convert json string to object
    def obj = objectMapper.readValue(JSON, Course.class);
    println(obj)

    Course course = new Course(name: obj?.name, pre: obj?.pre,
            regno: obj?.regno, enrolled: obj?.enrolled)

    course.validate()
    if(course.hasErrors()){
        println("Error: "+course.errors)
        result.put("Error is: ",course.errors)
        return result;
    }

    course.save(flush:true,failOnError: true)

    result.put("Message","Successfully Created")
    result.put("Result",course)
    return HttpResponse.created(result)
}

Передача его в ObjectMapper и последующее преобразование его из строки JSON в Java Object работало для меня.

Переданная мной строка Json выглядит следующим образом:

{
 "name" : "Data Structures",
 "pre" : "Computer Programming",
 "regno" : "249",
 "enrolled" : "90"
}

Вотхранение данных до и после изменения в базе данных:

+----+---------+------------------------+-------------------------------+----+
| id | version |        name      |   pre       |     regno        |enrolled |
+----+---------+------------------------+-------------------------------+----+
|  1 | 0 | "Computer Programming" | "Introduction to Programming"| "233"|"26"|
|  2 | 0 | Data Structures        | Computer Programming         |  249 | 90 |
+----+---------+------------------------+-------------------------------+----+

Надеюсь, что ответ поможет любому, кто ищет альтернативное решение для вышеуказанного решения.

0 голосов
/ 17 июня 2019

Кажется, мой командный класс, расширяющий какой-то другой класс, вызывал некоторые проблемы, которые означали, что ничего не работает. На данный момент это работает и действительно является рабочей альтернативой тому, что Зарьяб белудж предлагал выше.

package gateway.command.controller;


import com.fasterxml.jackson.annotation.JsonProperty;
import gateway.command.event.commands.HotelSaveCommand;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;
import io.micronaut.http.codec.MediaTypeCodecRegistry;
import io.micronaut.jackson.codec.JsonMediaTypeCodec;
import lombok.extern.slf4j.Slf4j;

import javax.inject.Inject;

@Slf4j
@Controller("/")
public class GatewayController  {

    @Inject
    protected MediaTypeCodecRegistry mediaTypeCodecRegistry;

    /**
     *
     * @param topic
     * @param eventType using the jsonProperty we actually extract eventType from the @Body string JSON String
     *                  The 3rd input is actual form. we post /hotel and json content there isn't actually 3 parameters
     *                  provided
     * @param
     * @return
     */
    @Post(uri = "/{topic}", consumes = MediaType.APPLICATION_JSON)
    public HttpResponse process(String topic, @JsonProperty("eventType") String eventType, @Body String formInput)  {

        JsonMediaTypeCodec mediaTypeCodec = (JsonMediaTypeCodec) mediaTypeCodecRegistry.findCodec(MediaType.APPLICATION_JSON_TYPE)
                .orElseThrow(() -> new IllegalStateException("No JSON codec found"));

        HotelSaveCommand command =  mediaTypeCodec.decode(HotelSaveCommand.class,formInput);
        if (command!=null) {
            System.out.println(command +" "+ command.getName());
        }
        //eventPublisher.publish(topic,);
        return HttpResponse.accepted();
    }

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

Вы не предоставили достаточно информации о своем проекте, чтобы знать, что происходит, но проект на https://github.com/jeffbrown/sfgroupsjsonbinding/tree/master демонстрирует, как работает встроенная привязка. Смотрите файл README.md там.

https://github.com/jeffbrown/sfgroupsjsonbinding/blob/3ff4e8b39ba5fda9956ebfc67cd0b9e5d940b8f2/src/main/groovy/sfgroupsjsonbinding/BookController.groovy

package sfgroupsjsonbinding

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Post

@Controller('/book')
class BookController {

    private PersonService personService

    BookController(PersonService personService) {
        this.personService = personService
    }

    @Get('/')
    List<Person> list() {
        personService.list()
    }

    @Post('/')
    Person save(Person person) {
        personService.save person
    }

    @Get('/{id}')
    Person get(long id) {
        personService.get id
    }
}

Взаимодействие с приложением

 $ curl -H "Content-Type: application/json" -d '{"name":"Jeff"}' http://localhost:8080/book
{"name":"Jeff","id":1}
 $ 
 $ curl -H "Content-Type: application/json" -d '{"name":"Jake"}' http://localhost:8080/book
{"name":"Jake","id":2}
 $ 
 $ curl -H "Content-Type: application/json" -d '{"name":"Zack"}' http://localhost:8080/book
{"name":"Zack","id":3}
 $ 
 $ curl http://localhost:8080/book
[{"name":"Jeff","id":1},{"name":"Jake","id":2},{"name":"Zack","id":3}]
 $ 
 $ curl http://localhost:8080/book/1
{"name":"Jeff","id":1}
 $ 
 $ curl http://localhost:8080/book/2
{"name":"Jake","id":2}
 $ 
 $ curl http://localhost:8080/book/3
{"name":"Zack","id":3}
 $ 
...