delete by login Spring controller

0

Chciałbym jakoś poprawnie zdefiniować w swoim kontrolerze dwie metody(może i więcej) do usuwania użytkowników. Wygląda to następująco:

@DeleteMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
	public void deleteUser(@PathVariable Long id) {
		userRepository.delete(id);
	}
	
	@DeleteMapping(path = "/{login}", produces = MediaType.APPLICATION_JSON_VALUE)
	public void deleteUserByLogin(@PathVariable String login) {
		userRepository.deleteUserByLogin(login);
	}

Repozytorium wygląda tak:

public interface UserRepository extends JpaRepository<User, Long>{
	
	User findByEmail(String email);
	
	@Modifying
    @Transactional
    @Query("delete from User u where u.login = ?1")
    void deleteUserByLogin(String login);

}

Po wywołaniu delete w angularze:

userService.delete({login: login}).$promise.then(

dostaję odpowiedź:

DELETE http://localhost:8080/games-organizer/api/users?login=user1 404 (Not Found)

Jest ona dla mnie zrozumiała ostatecznie, ale właśnie chciałbym się dowiedzieć w jaki sposób ustawić - pewnie metody controllera, tak abym miał możliwość usunięcia użytkownika po loginie oraz po id.

Z góry dziękuję za odpowiedź ;)

1

Jeżeli używasz @PathVariable, to zmienna będzie częścią adresu URL:

DELETE http://localhost:8080/games-organizer/api/users/user1

a nie parametrem zapytania URL (tego co jest po znaku ?)

1

Mylisz @PathVariable z @RequestParam. /to/jest/path/variable a xyz?to_jest=get_parameter

0

Rozumiem o co chodzi, ale właśnie jak obsłużyć to, żeby usuwać użytkownika na te 2 różne sposoby? Chodzi o to, że przy takim samym ustawieniu tych metod do usuwania z mapowaniem w kontrolerze, przy id prawidłowo odwołuje się do ścieżki, a przy loginie do parametru GET. To też chyba kwestia tego czy da się ustawić szukanie usera przy pomocy api, po id i po loginie?? Tak, by pod dwoma adresami:

http://localhost:8080/games-organizer/api/users/user1 - login
http://localhost:8080/games-organizer/api/users/1 - id
można było odnaleźć danego użytkownika. Da się to jakoś ustawić?

1

@lollollol123: to se ne da... przynajmniej bez użycia wyrażeń regularnych:


@DeleteMapping(path = "/{id:[0-9]+}", produces = MediaType.APPLICATION_JSON_VALUE)
    public void deleteUser(@PathVariable Long id) {
        userRepository.delete(id);
    }

    @DeleteMapping(path = "/{login:[a-zA-Z]+[a-zA-Z0-9]*}", produces = MediaType.APPLICATION_JSON_VALUE)
    public void deleteUserByLogin(@PathVariable String login) {
        userRepository.deleteUserByLogin(login);
    }

W pierwszym przypadku akceptujesz ścieżkę z co najmniej jedną cyfrą i odpowiada to wywołaniu po id. W drugim przypadku wywołanie po loginie będzie odbywać się gdy login zaczyna się od litery.

0

Problem tkwi w tym, że api jest na id wystawione i nie ogarnia tego loginu.
http://localhost:8080/games-organizer/api/users?login=user3
przez co wywala 404 w tym miejscu cały czas. Tu się pojawia problem.

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