2016-11-30 17 views
8

Tôi có một bộ điều khiển đơn giản với một handler GET chấp nhận một đối tượng để ràng buộc các thông số yêu cầu:Làm cách nào để ràng buộc các tham số yêu cầu mà không cần định vị?

@RestController 
@RequestMapping("/test") 
public class SampleController { 

    @GetMapping 
    public SomeResponse find(RequestParams params) { 
     // some code 
    } 

} 

Các RequestParams là một lớp POJO đơn giản:

public class RequestParams { 

    private String param1; 
    private String param2; 

    // constructor, getter, and setters 

} 

everthing hoạt động tốt, nhưng tôi muốn để loại bỏ những người định cư để làm cho đối tượng không thay đổi được để sử dụng công cộng. Trong phương pháp documentation cho @RequestMapping xử lý, chúng ta đọc rằng thể đối số phương pháp có giá trị là:

lệnh hoặc hình thức đối tượng để ràng buộc các thông số yêu cầu thuộc tính bean (thông qua setters) hay trực tiếp đến lĩnh vực

Có thể bằng cách nào đó ghi đè cấu hình khởi động Spring mặc định để các tham số yêu cầu được ràng buộc với các thuộc tính lớp bằng cách sử dụng sự phản chiếu chứ không phải với các bộ định tuyến không?

Trả lời

0

Tôi không nghĩ bạn cần thay đổi bất kỳ cấu hình nào trong khởi động mùa xuân. Có vẻ như các thùng chứa mùa xuân cố gắng để thiết lập các giá trị bằng cách sử dụng setter nếu có sẵn nếu không nó sử dụng các lĩnh vực trực tiếp. Vì vậy, bạn có thể vui lòng thử thay đổi phạm vi của các đối tượng của bạn trong lớp RequestParam thành công khai.

public class RequestParams { 

    public String param1; 
    public String param2; 

    // constructor, getter, and setters 

} 

Tôi chưa sử dụng một cái gì đó như thế này nhưng có vẻ như nó sẽ hoạt động. Hãy cho chúng tôi biết những gì đã xảy ra.

+0

Thật không may, nếu phạm vi của các trường được thay đổi thành 'public' và setters bị loại bỏ, các tham số yêu cầu không bị ràng buộc với đối tượng. Ngay cả khi, mục tiêu của tôi là giữ cho đối tượng bất biến, ít nhất là để sử dụng công cộng, do đó làm cho các lĩnh vực công cộng sẽ chỉ làm cho mọi việc tồi tệ hơn. –

1

thư viện mùa xuân Boot phụ thuộc vào Jackson (spring-boot-starter-web <-spring-boot-starter-json <-jackson libraries), do đó người ta có thể sử dụng các chú thích của mình để kiểm soát bindings json.

@JsonCreator constructors -annotated hoặc các phương pháp tĩnh cho phép nhanh chóng đối tượng mà không setters rõ ràng:

@JsonCreator 
public RequestParams(@JsonProperty("param1") String param1, 
        @JsonProperty("param2") String param2) { 
    this.param1 = param1; 
    this.param2 = param2; 
} 

Documentation

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