Почему контроллер REST возвращает код состояния 404? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь обновить данные в моей базе данных.Я использую jQuery / AJAX на внешнем интерфейсе и REST / MyBatis / MySQL на внутреннем.К сожалению, контроллер REST возвращает код состояния 404.Пожалуйста, посмотрите на мой код контроллера REST:

@RestController
@RequestMapping("/documents")
public class DocumentResources {

    private DocumentsMapper mapper;

    public DocumentResources(DocumentsMapper mapper) {
        this.mapper = mapper;
    }

    @PostMapping("/updateDocument")
    public List<Documents> updateDocument (@RequestBody Documents document) {
        mapper.updateDocument(document);
        return mapper.getAllDocuments();
    }
}

Вот мой код класса DocumentsMapper:

@Mapper
public interface DocumentsMapper {
    @Select("select * from documents")
    List<Documents> getAllDocuments();

    @Update("UPDATE documents SET title = #{title}, author = #{author}, src = #{src} WHERE id =#{id}")
    void updateDocument(Documents document);
}

А вот мой метод AJAX:

$( "#target" ).submit(function( event ) {
event.preventDefault();

var formData = {
    id : $("#target #id").val(),    
    title : $("#target #title").val(),
    author :  $("#target #author").val(),
    src: $("#target #src").val(),
    createTime : $("#target #createTime").val(),
    editTime : $("#target #editTime").val()
}

$.ajax({
        url: 'http://localhost:8088/documents/updateDocument',
        type : "POST",
        contentType : "application/json",
        data : JSON.stringify(formData),
        dataType : 'json',
        success : function(result) {
        },
          error: function() {
                window.location = "/error";
                console.log('error', arguments);
              },
                complete: function() {
                console.log('complete', arguments);
              }
            }).done(function() {
              window.location = "/documents";
              console.log('done', arguments);
            });
  });

Обновление

Я только что попытался отключить Spring Security и стал доступен метод POST.Вот функции авторизации:

    protected void configure(HttpSecurity http) throws Exception {

     http
        .authorizeRequests()                                                                
            .antMatchers("/resources/**", "/signup", "/about").permitAll()
            .antMatchers("/administrator/**").hasRole("ADMIN") 
            .antMatchers("/users/**").hasRole("ADMIN")
            .antMatchers("/documents/**").hasRole("ADMIN") 
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")            
            .anyRequest().authenticated()                                                   
        .and()
            .formLogin()
        .and()
            .logout().logoutSuccessUrl("/login?logout") 
        .and()
            .exceptionHandling().accessDeniedPage("/403")
//          .and()
//              .csrf()
                ;
}

Обновление

Я пытаюсь включить SpringSecurity, но отключить CSRF .csrf().disable().После этого POST методы работают.Я думаю, что отключение CSRF не очень хорошая идея.Это может привести к атакам XSS.Поэтому я должен настроить генерацию CSRF-токена и его обмен.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

вам нужно добавить projectName к адресам, например: http://localhost:8088/projectName/documents/updateDocument

0 голосов
/ 17 октября 2018

1) Пожалуйста, проверьте журналы запуска пружины: вы можете получить инициализированный URL для проекта

2) попробуйте указать контекстный путь для приложения,

эти ссылки могут быть полезны: весной MVC: Как установить корневой контекст в Spring Mvc Project весной загрузки: Добавить путь контекста в приложение Spring Boot

пример URL:

http://localhost:8088/{contextPath}/documents/updateDocument

3) лучше использовать документацию по API, например, пользовательский интерфейс Swagger, вы можете легко нажать на URL и получить доступные URL в своемклассы контроллеров.

0 голосов
/ 17 октября 2018

Я думаю, вам не хватает аннотации @Autowired в вашем коде.Попробуйте добавить эту аннотацию перед конструктором и повторите попытку.@Autowired public DocumentResources (DocumentsMapper mapper) {this.mapper = mapper;}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...