Spring 3.2 Jackson 2.2 REST API

0

Witam wszystkich. Jestem nowym członkiem forum oraz zaczynam swoją przygodę z technologiami REST. Wybrałem do projektu powyższe technologie. I mam małą zagwozdkę;). Tworze proste API RESTowe które na tą chwile wygląda następująco.

@Controller
public class WorkersController {

	@Autowired
	public DatabaseService dbService;
	
	@ResponseBody
	@RequestMapping(value="/workers", method = RequestMethod.GET, produces = "application/json")
	public ArrayList<Worker> getAllWorkersFromDatabase() {
	}
	
	@ResponseBody
	@RequestMapping(value="/workers/new", method = RequestMethod.POST, produces = "application/json", consumes="application/json")
	public String saveWorker(@RequestBody final WorkerDTO workerDto) {
	}
	
	@ResponseBody
	@RequestMapping(value="/workers/{workerid}", method = RequestMethod.GET, produces = "application/json")
	public Worker getWOrkerByDatabaseId(@PathVariable Integer workerid) {
	}
	
	@ResponseBody
	@RequestMapping(value="/workers/{workerid}/edit", method = RequestMethod.PUT, produces = "application/json")
	public String editWorker(@PathVariable Integer workerid, @RequestBody Worker worker) {
	}
}

Jeżeli chodzi o pobieranie danych za pomocą metod http GET wszystko działa, natomiast mam problem z wykonaniem POSTów. Kiedy próbuje wywołać metodę saveWorker() dostaję:

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method

Zaimportowałem do projektu poniższe biblioteki:

<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>${jackson.version}</version>
		</dependency>

Wydaje mi się że problem leży w konfiguracji, brakuje mi poprawnie skonfigurowanego Mappera dla @RequestBody i dlatego nie mapuje mi do WorkerDTO. Od springa 3.2 zmieniło się wsparcie dla jacksona 2, i stare rozwiązania nie działają. Moja konfiguracja wygląda następująco, jest ona zaciągnięta z tutoriala i najpewniej błędna w moim przypadku:

@Configuration
@ComponentScan(basePackages = "org.schedule.service")
@EnableWebMvc
@Import(DatabaseSpringConfig.class)
public class ServiceSpringConfig extends WebMvcConfigurerAdapter {

	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
	MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
	mappingJacksonHttpMessageConverter.setPrefixJson(false);
	mappingJacksonHttpMessageConverter.setPrettyPrint(true);
	converters.add(mappingJacksonHttpMessageConverter);
	}
}

Klasa WorkerDTO zawiera dwa pola string, settery i gettery, konstruktor oraz jest serializowana. Bardzo proszę o jakąś poradę.

0
  1. Pokaż DTO
  2. Pokaż json'a który wysyła przeglądarka
0
{
    "name": "asdssss",
    "surname": "asdssssss"
}
public class WorkerDTO implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public String name;
	public String surname;
	
	public WorkerDTO() {
	}
}
0

Spróbuj użyć @ModelAttribute zamiast @RequestBody

0

Ten sam błąd.

1

A jak wygląda wysłanie tego posta? Bo może nie ustawiasz tam odpowiedniego headera i stąd problem?

0

localhost:8080/Schedule-service/workers/new?Content-type=application/json

I tu był problem dopiero teraz zauważyłem że w Postmanie zamiast hedera ustawiam parametr;) Dzięki

0

Hmm podobnie dodanie consumes { "application/xml","application/json"}
powinno działać.

Jeśli piszesz usługi restowe to taka mała rada:

Zwracaj odpowiednie kody statusu, np metoda która coś tworzy powinna zwracać kod. 201 Created + odpowiedni nagłówek location.
Raczej unikaj konwencji thing/create, thing/update , thing/edit to co dana metoda robi nie powinno być rozróżniane poprzez uri tylko poprzez odpowiednie wywołanie odpowiednich metod
PUT, GET, DELETE itd.

Jeśli chcesz być master rest to polecam tutoriale springa + HATEOAS są tam bardzo fajnie opisane usługi REST + framework to testowania.

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