2015-10-31 19 views
12

Tôi đang làm việc trên dịch vụ web an toàn java. Tôi nhận được nó làm việc cho yêu cầu GET, nhưng yêu cầu POST không hoạt động. Lớp Trình điều khiển của tôi là RestController. Tôi đã thực hiện những việc này cho đến thời điểm này:Trạng thái HTTP 415 - yêu cầu đối tượng có định dạng không được hỗ trợ

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
public long signUp(@ModelAttribute ApiMemberModel apiMember) { 
    memberService = new MemberDetailsService(); 
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), ""); 
    return m.getId(); 
} 

Cũng đã thử RequestBody thay vì ModelAttribute.

Tôi sử dụng Postman extension để gửi yêu cầu POST. Ví dụ:

{ 
    "username": "asd", 
    "password": "sfsdg", 
    "email": "[email protected]" 
} 

Nhưng tôi nhận được lỗi:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. 

Tôi đang làm gì sai? Mô hình lớp học là:

public class ApiMemberModel { 
    private String username; 
    private String password; 
    private String email; 

    public ApiMemberModel(String username, String password, String email) { 
     this.username = username; 
     this.password = password; 
     this.email = email; 
    } 

    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 String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 
+1

Hiển thị cho chúng tôi mã của lớp mô hình của bạn – Marged

+2

@Được thêm vào ngay bây giờ. – nope

+2

_ "Cũng thử RequestBody thay vì ModelAttribute." _, Đúng vậy nhưng bạn cũng cần một nhà xây dựng no-arg trên mô hình hoặc người nào khác Jackson không thể tạo ra nó. Hoặc sử dụng '@ JsonCreator' –

Trả lời

27

Tôi đặt cược cuộc gọi từ Người đưa thư không bao gồm Content-Type: application/json.

HTTP 415 có nghĩa là máy chủ không hiểu định dạng phương tiện của yêu cầu. Trong bộ điều khiển của bạn, bạn xác định nó chấp nhận JSON, nhưng bạn đã không nói nếu yêu cầu chỉ ra rằng phần thân ở định dạng đó. Chỉ vì bạn đặt dữ liệu ở định dạng JSON, không có nghĩa là máy chủ sẽ nhận ra nó, bạn phải chỉ ra nó trong tiêu đề Content-Type.

+1

Cảm ơn! Chỉ định kiểu nội dung và thêm một hàm tạo no-arg đã giúp giải quyết vấn đề của tôi. – nope

+0

Bạn chính xác. Tôi đã tự hỏi ngay cả sau khi sử dụng jsonlint.com tại sao JSON của tôi không hợp lệ. – Dr4gon

+2

Xin chào! xin vui lòng tôi có cùng một vấn đề ngay cả khi tôi chỉ định Content-Type ở phía máy khách. Bạn co thể giup tôi được không? –

2

Mùa xuân cung cấp nhiều hộp mặc định HttpMessageConverters, sẽ được sử dụng để chuyển đổi, tùy thuộc vào sự hiện diện của một số thư viện trong đường dẫn lớp dự án. Ví dụ: nếu Tiêu đề yêu cầu loại nội dung là một trong ứng dụng/json hoặc ứng dụng/xml, điều đó có nghĩa là nội dung POST chứa json hoặc XML [Định dạng phổ biến] và nếu thư viện Jackson được tìm thấy trong đường dẫn lớp của bạn, Spring sẽ ủy quyền chuyển đổi thành MappingJackson2HttpMessageConverter [cho json] hoặc MappingJackson2XmlHttpMessageConverter [cho xml].

Để khai báo một sự phụ thuộc đến Jackson thư viện (jackson-DataBind) bao gồm sau đây phụ thuộc trong pom.xml của bạn

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>${jackson.version}</version> 
</dependency> 
0

tôi cũng có cùng một vấn đề. Thêm tiêu đề ContentType vào ứng dụng/xml (hoặc bất kỳ dịch vụ ur nào đang mong đợi) cho người đưa thư.

0

tôi là một chút xấu hổ để viết những dòng này, nhưng tôi quên đặt thuộc tính enctype="multipart/form-data" trong thẻ biểu mẫu:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data"> 
<!-- this thing right --------------------------------^ there! --> 
    <p> 
    Your file is: <input type="file" name="fajl" /> 
    </p> 
    <input type="submit" value="Upload It" /> 
</form> 

Đây là một lỗi khá khập khiễng, nhưng cũng là một trong đó mất một thời gian để nhận ra.

Các vấn đề liên quan