Невозможно реализовать метод POST при весенней загрузке

Я пытаюсь реализовать простой метод POST, но не могу этого сделать.

Пробовал несколько решений, упомянутых в «stackoverflow», но все равно получал ошибку.

Мой класс контроллера

@RestController
@RequestMapping("api/public")
public class PublicRestApiController {

@GetMapping("users")
public List<User> users(){
    return this.userRepository.findAll();
}

@PostMapping(path = "/insert",produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.ACCEPTED)
 public User add(@RequestBody UserRequest account) {
    User response = new User(account.getUsername(),account.getPassword(),account.getRoles(), account.getPermissions());
    return response;
    }

}

Класс UserRequest

public class UserRequest {

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public int getActive() {
    return active;
}
public void setActive(int active) {
    this.active = active;
}
public String getRoles() {
    return roles;
}
public void setRoles(String roles) {
    this.roles = roles;
}
public String getPermissions() {
    return permissions;
}
public void setPermissions(String permissions) {
    this.permissions = permissions;
}
private String username;
private String password;
private int active;
private String roles = "";
private String permissions = "";

}

Класс пользователя

@Entity
@Table(name = "USER_DETAILS")
public class User {

@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(nullable = false)
private String username;

@Column(nullable = false)
private String PASSWORD;

@Column
private int ACTIVE;

@Column
private String ROLES = "";

@Column
private String PERMISSIONS = "";

public User(String username, String password, String roles, String permissions){
    this.username = username;
    this.PASSWORD = password;
    this.ROLES = roles;
    this.PERMISSIONS = permissions;
    this.ACTIVE = 1;
}

public User(){}

public int getId() {
    return id;
}

public String getUsername() {
    return username;
}

public String getPassword() {
    return PASSWORD;
}

public int getActive() {
    return ACTIVE;
}

public String getRoles() {
    return ROLES;
}

public String getPermissions() {
    return PERMISSIONS;
}

public void setId(int id) {
    this.id = id;
}

public void setUsername(String username) {
    this.username = username;
}

public void setPassword(String password) {
    this.PASSWORD = password;
}

public void setActive(int active) {
    this.ACTIVE = active;
}

public void setRoles(String roles) {
    this.ROLES = roles;
}

public void setPermissions(String permissions) {
    this.PERMISSIONS = permissions;
}
}

Появляется это сообщение об ошибке.

2019-05-28 17:08:41.808  WARN 7712 --- [nio-8443-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]

Методы GET отлично работают в том же контроллере, получая только ошибку при попытке реализовать реализацию POST.

Запрос скриншота через Postman

Конфигурация безопасности

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/api/public/users").hasRole("ADMIN")
      .antMatchers("/api/public/insert").hasRole("ADMIN")
      .and()
      .httpBasic();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

}

Класс приложения

@SpringBootApplication(scanBasePackages = {"rc.bootsecurity"})
public class BootSecurityApplication {

public static void main(String[] args) {
    SpringApplication.run(BootSecurityApplication.class, args);
}

@Bean
public ServletWebServerFactory servletContainer() {
    // Enable SSL Trafic
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };

    // Add HTTP to HTTPS redirect
    tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());

    return tomcat;
}

private Connector httpToHttpsRedirectConnector() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8082);
    connector.setSecure(false);
    connector.setRedirectPort(8443);
    return connector;
    }
}

Прикрепленная ошибка говорит о том, что метод запроса «GET» не поддерживается, что правильно. Поскольку ваш контроллер POST... как убедиться, что метод GET работает....

DEBENDRA DHINDA 28.05.2019 14:04

иногда кэш сервера создает такие проблемы. Очистите кэш сервера и перезапустите сервер. Также в почтальоне проверьте, проверены ли заголовки типа контента или нет.

Manjunath H M 28.05.2019 14:10

Из сообщения об ошибке видно, что запрос почтальона отправляется как запрос GET вместо POST. Это возможно, когда происходит перенаправление, как показано здесь и здесь. Пожалуйста, проверьте, используете ли вы где-то перенаправления или нет.

g00glen00b 28.05.2019 14:14

Вы включили Spring Security? Если это так, возможно, вас перенаправляют на страницу «Отказано в доступе».

jAC 28.05.2019 14:32

@ g00glen00b Да, я перенаправляюсь с http -> https. Что можно сделать, чтобы решить эту проблему?

Srijib Sen 28.05.2019 14:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
5
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Possible Solution 1:

  1. Открытый почтальон
  2. Перейдите в настройки, используя раздел «Файл»
  3. Отключить автоматическое перенаправление


Possible Solution 2:

Добавьте extra / (trailing slash) to your endPoint изменить api/public/insert на api/public/insert/


Что служба поддержки почтальонов говорит о Я отправил запрос POST, но Почтальон, похоже, отправляет запрос GET.

This is mostly due to a server-side redirect. If Postman receives a 301 or 302 response code, it will automatically follow the redirect. Similar to the behaviour in browsers, the original request method will NOT be preserved, and the redirected request will be made with a GET method. If you want to disable the auto-follow redirect behaviour, or if you have other questions regarding this, please review the relevant documentation on redirects

Поддержка почтальонаРасширение перехватчикаGit-выпуск


ОБНОВИТЬ:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/api/public/users").hasRole("ADMIN")
      .antMatchers(HttpMethod.POST,"/api/public/insert").hasRole("ADMIN")
      .anyRequest().authenticated();
}

Я обновил свой класс безопасности и класс приложения в вопросе. Метод Get работает нормально. POST нет. Я пробовал оба ваших решения. Не получает Запрещенную ошибку.

Srijib Sen 29.05.2019 08:29

@SrijibSen, так что теперь ваш почтовый запрос отправляется как POST вместо GET, и теперь вы получаете 403 Forbidden, поправьте меня, если я ошибаюсь, и какое решение сработало для вас

Romil Patel 29.05.2019 08:38

теперь это работает. Я изменил настройки Postman и обновил код в соответствии с вашим советом. Большое спасибо.

Srijib Sen 29.05.2019 08:50

Добро пожаловать @SrijibSen

Romil Patel 29.05.2019 08:51

Можете ли вы помочь мне с другой проблемой, касающейся того же кода??

Srijib Sen 29.05.2019 09:24

@SrijibSen Я попытаюсь решить эту проблему, вы можете обновить вопрос здесь или задать новый вопрос в соответствии с вашими потребностями.

Romil Patel 29.05.2019 09:30
stackoverflow.com/questions/56357766/… это новая проблема @Patel Romil
Srijib Sen 29.05.2019 11:53

Другие вопросы по теме