user3170595
user3170595

Reputation: 109

Can pass my own object with RestTemplate PUT

I want to build a small RESTful Service, send a PUT request with an Object of a class I created (MyObject), and getting a response with only status.

My controler:

@RestController 
public class MyControler {

@RequestMapping(path = "/blabla/{id}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<String> putMethod (@PathVariable("id") Long id,
                                         @RequestBody MyObject t) {
   /*todo*/
   return new ResponseEntity<String>(HttpStatus.OK);
}

My Test App

@SpringBootApplication
public class App {
public String httpPut(String urlStr)  {
  MyObject myObject = new MyObject(p,p,....);
  URI url = null;
  HttpEntity<MyObject> requestEntity;

  RestTemplate rest = new RestTemplate();
  rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

  HttpHeaders headers = new HttpHeaders();

  List<MediaType> list = new ArrayList<MediaType>();
  list.add(MediaType.APPLICATION_JSON);
  headers.setAccept(list);
  headers.setContentType(MediaType.APPLICATION_JSON);
  headers.add("Content-Type", "application/json");

  requestEntity = new HttpEntity<Transaction>(t, headers);

   ResponseEntity<String> response =
                rest.exchange(url, HttpMethod.PUT, requestEntity, MyObject.class);

       return response.getStatusCode().getValue();
}

Im getting an HttpClientErrorException: 400 Bad Request Where is my mistake? What I want is for Spring to automaticly serialize the MyObject. MyObject class is implementing serializable. What do I miss?

}

Upvotes: 2

Views: 19000

Answers (2)

Yannic B&#252;rgmann
Yannic B&#252;rgmann

Reputation: 6581

Maybe you're doing to much?

Did you try to put the object as json via postman or something similar? If so what is the response?

Nevertheless i created a minimal example for consuming a service via Springs RestTemplate.

This is all needed code for getting a custom object AND putting a custom object via RestTemplate

public void doTransfer(){

    String url = "http://localhost:8090/greetings";


    RestTemplate restTemplate = new RestTemplate();

    ResponseEntity<Greeting> greeting = restTemplate.getForEntity(url, Greeting.class);
    LOGGER.info(greeting.getBody().getValue());


    Greeting myGreeting = new Greeting();
    myGreeting.setValue("Hey ho!");
    HttpEntity<Greeting> entity = new HttpEntity<Greeting>(myGreeting);
    restTemplate.exchange(url, HttpMethod.PUT, entity, Greeting.class);

}

I've provided a sample project with a sender (maybe not a good name .. it is the project with the greetings endpoint) and a receiver (the project which consumes the greetings endpoint) on Github

Upvotes: 4

luboskrnac
luboskrnac

Reputation: 24561

Try to do this:

ResponseEntity<MyObject> responseSerialized =
                rest.exchange(url, HttpMethod.PUT, requestEntity, MyObject.class);

Upvotes: 0

Related Questions