2016-02-13 8 views
1

У меня есть следующий контроллер:HTTP Status 405 - метод запроса 'PUT' не поддерживается

@RestController 
public class RestaurantController { 
    @Autowired 
    RestaurantService restaurantService; 
    @RequestMapping(value = "/restaurant/", method = RequestMethod.GET) 
    public ResponseEntity<List<Restaurant>> listAllRestaurants() { 
     System.out.println("Fetching all restaurants"); 
     List<Restaurant> restaurants = restaurantService.findAllRestaurants(); 
     if(restaurants.isEmpty()){ 
      return new ResponseEntity<List<Restaurant>>(HttpStatus.NO_CONTENT);//You many decide to return HttpStatus.NOT_FOUND 
     } 
     return new ResponseEntity<List<Restaurant>>(restaurants, HttpStatus.OK); 
    } 
    @RequestMapping(value = "/restaurant/{id}", method = RequestMethod.PUT) 
    public ResponseEntity<Restaurant> updateRestaurant(@PathVariable("id") int id, @RequestBody Restaurant restaurant) { 
     System.out.println("Updating Restaurant " + id); 

     Restaurant currentRestaurant = restaurantService.findById(id); 

     if (currentRestaurant==null) { 
      System.out.println("Restaurant with id " + id + " not found"); 
      return new ResponseEntity<Restaurant>(HttpStatus.NOT_FOUND); 
     } 

     currentRestaurant.setName(restaurant.getName()); 
     currentRestaurant.setDescription(restaurant.getDescription()); 
     currentRestaurant.setIcon(restaurant.getIcon()); 

     restaurantService.updateRestaurant(currentRestaurant); 
     return new ResponseEntity<Restaurant>(currentRestaurant, HttpStatus.OK); 
    } 
} 

Вот мои звонки от почтальона. Сначала я делаю звонок GET, чтобы получить все рестораны, и он отлично работает enter image description here Во-вторых, я пытаюсь обновить объект, я получаю следующее сообщение об ошибке. enter image description here В Tomcat 8.0.32, я получаю следующий журнал:

13-февраля-2016 16: 55: 09,442 ПРЕДУПРЕЖДЕНИЕ [HTTP-апрелю-8080-Exec-9] org.springframework. web.servlet.PageNotFound.handleHttpRequestMethodNotSupported метод запроса «PUT» не поддерживается

Я не понимаю, что это, как это возможно. А вот моя зависимость:

<properties> 
     <springframework.version>4.1.6.RELEASE</springframework.version> 
     <springsecurity.version>4.0.1.RELEASE</springsecurity.version> 
     <hibernate.version>4.3.6.Final</hibernate.version> 
     <mysql.connector.version>5.1.31</mysql.connector.version> 
     <jackson.version>2.6.3</jackson.version> 
     <joda-time.version>2.3</joda-time.version> 
     <testng.version>6.9.4</testng.version> 
     <mockito.version>1.10.19</mockito.version> 
     <h2.version>1.4.187</h2.version> 
     <dbunit.version>2.2</dbunit.version> 
    </properties> 

    <dependencies> 
     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 
     <!-- Hibernate --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 

     <!-- jsr303 validation --> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.1.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.1.3.Final</version> 
     </dependency> 

     <!-- MySQL --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>${mysql.connector.version}</version> 
     </dependency> 

     <!-- Joda-Time --> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>${joda-time.version}</version> 
     </dependency> 

     <!-- To map JodaTime with database type --> 
     <dependency> 
      <groupId>org.jadira.usertype</groupId> 
      <artifactId>usertype.core</artifactId> 
      <version>3.0.0.CR1</version> 
     </dependency> 
     <!-- Spring Security --> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${springsecurity.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${springsecurity.version}</version> 
     </dependency> 
     <!-- Servlet+JSP+JSTL --> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>javax.servlet.jsp-api</artifactId> 
      <version>2.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <!-- Need this for json to/from object --> 
     <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> 
     <!-- Testing dependencies --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${springframework.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.testng</groupId> 
      <artifactId>testng</artifactId> 
      <version>${testng.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>${mockito.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>${h2.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>dbunit</groupId> 
      <artifactId>dbunit</artifactId> 
      <version>${dbunit.version}</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

Если необходима дополнительная информация, пожалуйста, скажите мне! Благодарю.

Edit 1:

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 


    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("bill").password("user").roles("USER"); 
     auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); 
     auth.inMemoryAuthentication().withUser("dba").password("dba").roles("ADMIN","DBA"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.authorizeRequests() 
     .antMatchers("/", "/home","/restaurant/**").permitAll() 
     .antMatchers("/list").access("hasRole('USER')") 
     .antMatchers("/list").access("hasRole('ADMIN')") 
     .antMatchers("/admin/**").access("hasRole('ADMIN')") 
     .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 
     .and().formLogin().loginPage("/login") 
     .usernameParameter("ssoId").passwordParameter("password") 
     .and().csrf() 
     .and().exceptionHandling().accessDeniedPage("/Access_Denied"); 
    } 
} 

Edit 2:

2016-02-14 12:30:56 DEBUG FilterChainProxy: 324 -/ресторан/1 в положении 1 из 12 в дополнительном цепь фильтра; Фильтр стрельбы: 'WebAsyncManagerIntegrationFilter'

2016-02-14 12:30:56 ОТЛАДКА FilterChainProxy: 324 -/ресторан/1 в положении 2 в 12 дополнительных фильтра цепи; Фильтр стрельбы: '' SecurityContextPersistenceFilter

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository: 159 - Нет HttpSession в настоящее время не существует

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository: 101 - Нет SecurityContext был , доступный с HttpSession: null. Будет создан новый.

2016-02-14 12:30:56 DEBUG FilterChainProxy: 324 -/ресторан/1 на позиция 3 из 12 в дополнительной цепи фильтра; стрельбы Фильтр: 'HeaderWriterFilter'

2016-02-14 12:30:56 DEBUG HstsHeaderWriter: 128 - Не инъекционного заголовок HSTS, поскольку она не соответствовала requestMatcher org.springframework.security.web.header.writers ,HstsHeaderWriter $ SecureRequestMatcher @ 3ded3d8a

2016-02-14 12:30:56 DEBUG FilterChainProxy: 324 -/ресторан/1 на позиция 4 из 12 в дополнительной цепи фильтра; стрельбы Фильтр: 'CsrfFilter'

2016-02-14 12:30:56 DEBUG CsrfFilter: 106 - Invalid CSRF токен найдено http://localhost:8080/SpringSecurityCusotmLoginFormAnnotationExample/restaurant/1

2016-02-14 12:30:56 DEBUG DispatcherServlet : 861 - DispatcherServlet с именем запроса 'диспетчерская' обработка PUT для [/ SpringSecurityCusotmLoginFormAnnotationExample/ACCESS_DENIED]

2016-02-14 12:30:56 DEBUG RequestMappingHandlerMapping: 294 - Глядя вверх метод обработчика для пути/ACCESS_DENIED

2016-02-14 12:30:56 ОТЛАДКА ExceptionHandlerExceptionResolver: 134 - Разрешающая исключение из обработчика [нуль]: org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса 'PUT' не поддерживается

2016-02-14 12:30:56 ОТЛАДКА ResponseStatusExceptionResolver: 134 - Разрешающая исключение из обработчика [нуль]: org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса 'PUT' не поддерживается

2016-02-14 12:30:56 ОТЛАДКА DefaultHandlerExceptionResolver: 134 - Разрешающая исключение из обработчика [нуль]: org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса 'PUT' не поддерживается

2016-02 -14 12:30:56 WARN PageNotFound: 198 - метод запроса 'PUT' не поддерживается

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository: 337 - SecurityContext пуст или содержимое анонимным - контекст не хранить в HttpSession.

2016-02-14 12:30:56 DEBUG DispatcherServlet: 1034 - Null ModelAndView вернулся в DispatcherServlet с именем 'диспетчером': при условии HandlerAdapter завершенный запрос на обработку

2016-02-14 12:30 : 56 DEBUG DispatcherServlet: 996 - Успешно завершен запрос

2016-02-14 12:30:56 DEBUG DefaultListableBeanFactory: 248 - Возвращение кэшируется экземпляра одноплодного боба 'delegatingApplicationListener'

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository: 337 - SecurityContext пуст или содержимое анонимно - контекст не будет храниться в HttpSession.

2016-02-14 12:30:56 DEBUG SecurityContextPersistenceFilter: 105 - SecurityContextHolder Теперь очищается, как обработка запроса завершена

+1

Похоже, что глагол PUT был отключен Apache Tomcat. Сделайте поиск Google при отключении PUT в Apache Tomcat, и вы увидите много сообщений, которые говорят об отключении. Затем вы можете увидеть, существует ли какой-либо из этих параметров (a) в вашем приложении или, более вероятно, (b) в настройках Apache Tomcat. – EJK

+0

@ EJK также нужно что-то сделать с моей конфигурацией Spring Security? – KostasC

+0

@EJK Я попробовал другой wepapp с PUT, DELETE, и он работает! – KostasC

ответ

1

Попробуйте повысить уровень ведения журнала для org.springframework.web до DEBUG. Это даст вам некоторое представление о том, как Spring пытается справиться с запросом. Надеюсь, это даст вам (или нам) еще несколько подсказок о том, как это исправить.

Если вы используете Spring бутс, просто добавьте эту строку в ваш application.properties файла:

logging.level.org.springframework.web=DEBUG 

Edit после просмотра дополнительной протоколировании:

'PUT' не поддерживается сообщение немного вводит в заблуждение. Перед этим стоит настоящая проблема. У вас нет действительного токена CSRF. Как вы отправляете запрос? Похоже, вы используете инструмент PostMan (но я не знаком с этим инструментом), а не отправляю форму непосредственно с веб-страницы. Возможно, вы можете добавить токен к своему запросу с помощью инструмента. Работает ли он без инструмента - отправка формы непосредственно с веб-страницы?

+0

Да, вы правы! Я сделал это с веб-страницы и перешел по этой ссылке http://stackoverflow.com/questions/27834867/spring-security-csrf-token-not-working-with-ajax. И теперь я получаю 400 плохих запросов! – KostasC

1

вместо отправки запроса на /restaurant/1/, отправить его в /restaurant/1

0

По умолчанию WebMvcAutoConfiguration, HttpPutFormContentFilter не настроен и, следовательно, проблема.

Устанавливается в весеннем ботинке [1.3.0) версии и работает отлично. Таким образом, вы можете попробовать обновить версию Spring-Boot или настроить этот фильтр вручную, чтобы все работало.

Issue reference.
Another Stackoverlow reference

Надеюсь, это поможет.

0

У меня была такая же ошибка, но для меня это было вызвано тем, что я пропустил параметр url. В моем случае параметр url фактически не нужен, потому что он был в теле JSON, но я сохранил его в URL-адресе, чтобы соответствовать REST.

Когда я сменил .../ресторан на ... ресторан/1, ошибка исчезла.

Смежные вопросы