Nadpisanie domyślnego konwentera POST requesta do encji obiektu w Spring

0

Mam sobie standardowy kontroler w projekcie opartym o Spring Boot. Jest metoda zapisująca obiekt typu Car:

	@RequestMapping(value = "car", method = RequestMethod.POST)
	public String save(Car car) {
		carService.save(car);
		return "redirect:/car/edit/" + car.getId();
	}

Niestety w moim przypadku takie standardowe zapisywanie nie zdaje egzaminu. Potrzebuje pobrać "ręcznie" różne atrybuty z GET-a i zmienić w jakiś sposób ten zapisywany obiekt. Pytanie jak to zrobić?

Rozumiem, że pomiedzy przyjęciem requesta z POST-a a wejściem do metody save(Car car) jest jakiś automatyczny konwenter, który "przerabia" POST-a na obiekt. Potrzebuje go właśnie nadpisać.

0

Ale przed zapisem możesz zrobić co Ci się podoba z obiektem car, więc nie bardzo rozumiem pytania.

0

Jeśli chcesz mieć raka to
W Spingu możesz sobie wstrzyknąć takie pole :

private @Autowired HttpServletRequest request;

I tam bedziesz mał wszystko z request. Wygląda prosto, ale boli całe życie.

Alternatywą (mniej zagrożoną nowotworami) jest np. nowy kawałek Spring 5 gdzie z wykorzystaniem funkcyjnego WebFlux możesz napisać POST tak:

 [...]
//definicja routingu
private void serve() {
        RouterFunction route = nest(path("/api"),
                    route(GET("/time"), renderTime())
                    .andRoute(GET("/messages"), renderMessages())
                    .andRoute(POST("/messages").and(contentType(APPLICATION_JSON)), postMessage()));
  }
     [...]

//metoda post
    private HandlerFunction<ServerResponse> postMessage() {
        return request -> {
            final List<Message> messages = new ArrayList<>();
           Mono<Message> message = request.bodyToMono(Message.class); ///tu sobie sam możesz wstawić własny sposób konwersji
            final Mono<ServerResponse> res=  message.flatMap( m-> {
                messages.add(m);
                return ServerResponse.ok()
                        .contentType(APPLICATION_JSON)
                        .body(fromObject(messages));
            } );
            return res;
        };
    }
```


(albo update sla @Shalom, @karolinaa - jak wygląda  na gotowo taka metoda):
```
private HandlerFunction<ServerResponse> postMessage() {
        return request -> {
            request.bodyToMono(Message.class)
                 .flatMap( message -> 
                     messagesOrErrorFromTopic(service.addMessageToTopic(request.pathVariable("topic"), message));
             );
        };
    }
```
https://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-reactive.html#web-reactive-server-functional
0

Zrobiłem sobie ObjectContext, który posiada kilka obiektów i kontroller je zmienia w kilku repozytoriach czy dobrze to rozwiązałem?

0

jarekr000000 podałeś rozwiązanie z WebFlux. Z tego co widzę to ALTERNATYWA dla Spring MVC. Rozwiązanie działa w Spring MVC. Co polecasz dla Spring MVC?

1 użytkowników online, w tym zalogowanych: 0, gości: 1