spring-in-action-5-samples icon indicating copy to clipboard operation
spring-in-action-5-samples copied to clipboard

[Ch 07] Exception while using PUT method

Open rnaveen93 opened this issue 4 years ago • 2 comments

I tried to modify an ingredient using RestTemplate PUT but received below error.

No accessor to set property private final java.lang.String tacos.Ingredient.name!"},"message":"Could not read payload!

Full stacktrace:

21:24:03.608 [main] DEBUG org.springframework.web.client.RestTemplate - HTTP PUT http://localhost:8080/api/ingredients/FLTO 21:24:03.641 [main] DEBUG org.springframework.web.client.RestTemplate - Writing [Ingredient(id=FLTO, name=Indian Papad, type=WRAP)] with org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 21:24:03.717 [main] DEBUG org.springframework.web.client.RestTemplate - Response 400 BAD_REQUEST Exception in thread "main" org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"cause":{"cause":{"cause":null,"message":"No accessor to set property private final java.lang.String tacos.Ingredient.name!"},"message":"Could not read payload!; nested exception is java.lang.Unsuppo... (651 bytes)] at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:101) at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:170) at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:112) at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674) at org.springframework.web.client.RestTemplate.put(RestTemplate.java:478) at tacos.web.consumeApi.RestTemplateDemo.updateIngredient(RestTemplateDemo.java:53) at tacos.web.consumeApi.RestTemplateDemo.main(RestTemplateDemo.java:26)

Ingredient.java

@Data
@RequiredArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
@Entity
public class Ingredient {

	@Id
	private final String id;
	private final String name;

	@Enumerated(EnumType.STRING)
	private final Type type;

	public static enum Type {
		WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
	}
}

Put RestTemplate:

Ingredient ingredient = new Ingredient("FLTO", "Indian Papad", Type.WRAP);
demo.updateIngredient(ingredient);

public void updateIngredient(Ingredient ingredient) {
		RestTemplate rest = new RestTemplate();
		rest.put("http://localhost:8080/api/ingredients/{id}", ingredient, ingredient.getId());
}

rnaveen93 avatar Apr 29 '20 16:04 rnaveen93

Changing Ingredient class to below resolves the issue. I removed final keyword on the fields and added a constructor. But i believe it kinda defeats the purpose (Encapsulation and or Immutability). Can someone advise.

@Data
@NoArgsConstructor
@Entity
public class Ingredient {

	@Id
	private  String id;
	private  String name;

	@Enumerated(EnumType.STRING)
	private  Type type;

	public static enum Type {
		WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
	}

	public Ingredient(String id, String name, Type type) {
		super();
		this.id = id;
		this.name = name;
		this.type = type;
	}
}

rnaveen93 avatar Apr 29 '20 16:04 rnaveen93

What IDE are you using? NetBeans or Ecllipse? Are are using Ecllipe? The @Data annotation does not work for Ecllipse sometime.

On Wed, Apr 29, 2020 at 12:14 PM Naveen [email protected] wrote:

Changing Ingredient class to below resolves the issue. I removed final keyword on the fields and added a constructor. But i believe it kinda defeats the purpose (Encapsulation and or Immutability). Can someone advise.

@Data @NoArgsConstructor @Entity public class Ingredient {

@Id private String id; private String name;

@Enumerated(EnumType.STRING) private Type type;

public static enum Type { WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE }

public Ingredient(String id, String name, Type type) { super(); this.id = id; this.name = name; this.type = type; } }

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/habuma/spring-in-action-5-samples/issues/79#issuecomment-621313332, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEUCCLLAKVFHLT437MQWFGLRPBG6BANCNFSM4MT3JL4A .

Sammygracezhu avatar Apr 30 '20 00:04 Sammygracezhu