2014-11-04 4 views
3

메신저 400 건의 아약스 요청에 대한 잘못된 요청이 항상 있습니다. 나는 이것으로 무엇이 잘못 될 수 있는지 전혀 모른다. 임 사용 :스프링 MVC 400 불량 요청 아약스

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.9.12</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
<version>4.0.5.RELEASE</version> </dependency> 

컨트롤러 :

@Controller("bookController") 
@RequestMapping("/book") 
public class BookControllerImpl implements BookController { 

    @Autowired 
    BookService bookService; 

    @Override 
    @RequestMapping(value = "/new", method = RequestMethod.GET) 
    public String addBookToSystem(Model model) { 
     model.addAttribute("book", new Book()); 
     return "book/newBook"; 
    } 

    @Override 
    @RequestMapping(value = "/new", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody Book addBookToSystem(@RequestBody Book book) { 
     book.setBookStatus(BookStatus.AWAITING); 
     return bookService.get(bookService.save(book)); 
    } 

아약스 전화 :

$(document).ready(function(){ 

    $('#addBook').submit(function(event) { 

     var ISBN = $('#ISBN').val(); 
     var author = $('#author').val(); 
     var description = $('#description').val(); 
     var pages = $('#pages').val(); 
     var publicationYear = $('#publicationYear').val(); 
     var publisher = $('#publisher').val(); 
     var title = $('#title').val(); 
     var json = { "ISBN" : ISBN, "author" : author, "description" : description, "pages" : pages, "publicationYear" : publicationYear, "publisher" : publisher, "title" : title }; 

     $.ajax({ 
      url: $("#addBook").attr("action"), 
      data: JSON.stringify(json), 
      type: "POST", 
      dataType: 'json', 
      contentType: 'application/json', 
      success: function(book) { 
       var respContent = ""; 

       respContent += "<span class='success'>Dodano "; 
       respContent += book.title; 
       respContent += " do listy ksiazek oczekujacych na zatwierdzenie!</span>"; 

       $("#bookResponse").html(respContent); 
      } 
     }); 
     event.preventDefault(); 
    }); 
}); 

HTTP 요청 :

POST /ksiazka/book/new.json HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Content-Length: 100 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: http://localhost:8080 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36 
Content-Type: application/json 
Referer: http://localhost:8080/ksiazka/book/new 
Accept-Encoding: gzip,deflate 
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4,pt;q=0.2 
Cookie: SPRING_SECURITY_REMEMBER_ME_COOKIE=bWFjaWVqbWlzMkBnbWFpbC5jb206MTQxNzUzODc3ODU4NjpjYjY3YTZiMWYyMGJjODYyMDYxMDQyNDIyN2NmNjQ3Mg; JSESSIONID=c5a72acb3bd1a165f9c2d705a199 

응답 :

,536,
HTTP/1.1 400 Bad Request 
Server: GlassFish Server Open Source Edition 4.1 
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.8) 
Content-Language: 
Content-Type: text/html 
Date: Tue, 04 Nov 2014 19:49:08 GMT 
Connection: close 
Content-Length: 1105 

어떤 아이디어가이 문제를 해결할 수 있습니까? 기본 자료로 this 자습서를 사용했습니다. 검색 및 400 잘못된 요청 오류 스레드 대부분을 읽었지만 내 문제를 해결하지 못했습니다.

편집 : 예약 클래스 :

@Entity 
    @Table(name="Book") 
    @Indexed 
    public class Book { 

     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "bookId") 
     private Long id; 
     @Column(nullable = false) 
     @Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO) 
     private String title; 
     @Column(nullable = false, unique = true) 
     private String ISBN; 
     @Column(nullable = false) 
     @Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO) 
     private String author; 
     private String publisher; 
     @Column(length = 1000) 
     private String description; 
     private int publicationYear; 
     private int pages; 
     @Enumerated(EnumType.STRING) 
     @Column(nullable = false) 
     private BookStatus bookStatus; 
     @ManyToMany(mappedBy = "booksWant", cascade = CascadeType.ALL) 
     private List<User> user = new ArrayList<User>(0); 
     @OneToMany(mappedBy = "book", cascade = CascadeType.ALL) 
     private List<UserBook> bookList = new ArrayList<UserBook>(0); 

     public Book(String title, String ISBN, String author, String publisher, String description, 
        int publicationYear, int pages, BookStatus bookStatus) { 
      this.title = title; 
      this.ISBN = ISBN; 
      this.author = author; 
      this.publisher = publisher; 
      this.description = description; 
      this.publicationYear = publicationYear; 
      this.pages = pages; 
      this.bookStatus = bookStatus; 
     } 
    getters and setters 

    } 

Edit2가 :

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> 
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> 
<%@page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

<tiles:insertDefinition name="template"> 
    <tiles:putAttribute name="content"> 

     <h2>book/newBook.jsp</h2> 

     <div id="bookResponse"> 

     </div> 
     <div> 
      Add a book to system: 
     </div> 
     <div> 
      <sf:form id="addBook" action="${pageContext.request.contextPath}/book/new" modelAttribute="book"> 
       <table> 
        <tr> 
         <td><label>isbn: </label></td> 
         <td><sf:input path="ISBN" id="ISBN" /></td> 
         <td><sf:errors path="ISBN" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Autor: </label></td> 
         <td><sf:input path="author" id="author" /></td> 
         <td><sf:errors path="author" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Tytul: </label></td> 
         <td><sf:input path="title" id="title" /></td> 
         <td><sf:errors path="title" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Opis: </label></td> 
         <td><sf:textarea path="description" id="description" /></td> 
         <td><sf:errors path="description" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Ilosc stron: </label></td> 
         <td><sf:input path="pages" id="pages" /></td> 
         <td><sf:errors path="pages" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Rok wydawania: </label></td> 
         <td><sf:input path="publicationYear" id="publicationYear" /></td> 
         <td><sf:errors path="publicationYear" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><label>Wydawca: </label></td> 
         <td><sf:textarea path="publisher" id="publisher" /></td> 
         <td><sf:errors path="publisher" cssClas="error" /></td> 
        </tr> 
        <tr> 
         <td><input name="submit" type="submit" value="Dodaj" class="btn btn-primary" /></td> 
        </tr> 
       </table> 
      </sf:form> 
     </div> 

    </tiles:putAttribute> 
</tiles:insertDefinition> 
+0

도서 모델 클래스도 표시 할 수 있습니까? – Jeroen

+0

수정 된 첫 번째 게시물입니다. – rhep

+0

어떤 뷰 기술을 사용하고 있습니까? – Aeseir

답변

2

에서 . 여기에 내가 그것을 작동하게하기 위해 무슨 짓을 : 는 첫째로 나는 jackson2에 의존성을 변경

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
    <version>2.4.3</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.4.3</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.4.3</version> 
</dependency> 

가 그럼 난 @JsonProperty과 @JsonIgnore 내 예약 클래스를 주석. 업데이트 된 책 클래스입니다.

@Entity 
    @Table(name="Book") 
    @Indexed 
    public class Book { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "bookId") 
    @JsonIgnore 
    private Long id; 
    @Column(nullable = false) 
    @Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO) 
    @JsonProperty("title") 
    private String title; 
    @Column(nullable = false, unique = true) 
    @JsonProperty("ISBN") 
    private String ISBN; 
    @Column(nullable = false) 
    @Field(index = Index.YES, analyze=Analyze.YES, store=Store.NO) 
    @JsonProperty("author") 
    private String author; 
    @JsonProperty("publisher") 
    private String publisher; 
    @Column(length = 1000) 
    @JsonProperty("description") 
    private String description; 
    @JsonProperty("publicationYear") 
    private int publicationYear; 
    @JsonProperty("pages") 
    private int pages; 
    @Enumerated(EnumType.STRING) 
    @Column(nullable = false) 
    @JsonIgnore 
    private BookStatus bookStatus; 
    @ManyToMany(mappedBy = "booksWant", cascade = CascadeType.ALL) 
    @JsonIgnore 
    private List<User> user = new ArrayList<User>(0); 
    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL) 
    @JsonIgnore 
    private List<UserBook> bookList = new ArrayList<UserBook>(0); 

    public Book(String title, String ISBN, String author, String publisher, String description, 
       int publicationYear, int pages, BookStatus bookStatus) { 
     this.title = title; 
     this.ISBN = ISBN; 
     this.author = author; 
     this.publisher = publisher; 
     this.description = description; 
     this.publicationYear = publicationYear; 
     this.pages = pages; 
     this.bookStatus = bookStatus; 
    } 
    getters and setters 

} 
0

제거 " 'ContentType을'응용 프로그램/JSON ',"나는 내 문제를 해결 아약스 호출

+0

Content-Type 속성이'application/json'과 다르기 때문에이 작업을 수행 할 때 415 Unsupported Media와 해당 항목이 있습니다. – rhep

+0

Book 객체 앞에 추가 된 RequestBody를 (a) 컨트롤러의 ModelAttribute로 변경해야합니다. 귀하의 경우에는 실제로 요청을 게시하는 동안 JSP 페이지의 필드를 Book 객체의 상대 변수와 바인딩하려고합니다. 그래서 그것은 (a) ModelAttribute가하는 것입니다. (a) RequestBody가하는 것은 실제로 페이지의 데이터를 String과 같은 n 객체로 변환하는 것입니다. contentType을 지정할 때 아약스 호출은 요청 페이로드를 사용하여 요청을 게시하므로 기본적으로 서버 측에 양식 데이터를 게시하므로 Chrome Devtool을 통해 확인할 수 있습니다. –