Không thể tạo chú thích meta cho @RequestBody trong Springboot

Aug 15 2020

Tôi muốn tạo một chú thích meta, được gọi là @QueryRequest, cho Spring @RequestBodygiống như được hiển thị bên dưới.

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@RequestBody
public @interface QueryRequest {
}

Tuy nhiên, nó đưa ra một lỗi biên dịch có tên là,java: annotation type not applicable to this kind of declaration

Khi tôi tìm kiếm trên internet, nó bảo tôi xác minh đúng @Targetloại. Dù sao, như bạn đã có thể thấy các giá trị @Targetvà của tôi @Retention, chúng giống như giá trị của Spring @RequestBody, nhưng vẫn xảy ra lỗi ở trên.

Tôi đã tạo thành công chú thích meta cho @Target=ElementType.METHODhoặc ElementType.TYPEloại, nhưng tôi không thể thực hiện công việc ở trên chú thích.

Có ai biết điều gì thực sự sai với chú thích meta ở trên không?

Trả lời

1 DanielJacob Aug 16 2020 at 02:15

Vì @RequestBody được chú thích @Target(ElementType.PARAMETER)nên bạn chỉ có thể thêm chú thích này vào một tham số. Ở đây bạn đang cố gắng áp dụng chú thích trên một chú thích. Để đạt được điều đó @RequestBodynên được chú thích với @Target(ElementType.ANNOTATION_TYPE)hoặc với @Target(ElementType.TYPE).

Ví dụ: mã này sẽ không hoạt động vì bạn không thể chú thích QueryRequest trên một chú thích:

@Target(ElementType.PARAMETER)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest

Tuy nhiên, điều này sẽ hoạt động, bởi vì bạn đang cho phép QueryResult được đưa vào chú thích

@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest

 @Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryRequest {
}
@Target(ElementType.ANNOTATION_TYPE)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@QueryRequest
@interface NextQueryRequest
isuru89 Aug 16 2020 at 10:19

@Daniel đã giải thích lý do tại sao điều này xảy ra với một ví dụ.

Ngoài ra, bất kỳ ai đang tìm kiếm giải pháp thay thế nên đọc câu trả lời này như @Michiel đã đề cập ở trên.https://stackoverflow.com/a/40861154/2148365