@Override public void afterPropertiesSet() { // Do this first, it may add ResponseBody advice beans initControllerAdviceCache(); if (this.argumentResolvers == null) { /** */ List resolvers = getDefaultArgumentResolvers(); this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } if (this.initBinderArgumentResolvers == null) { List resolvers = getDefaultInitBinderArgumentResolvers(); this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } if (this.returnValueHandlers == null) { List handlers = getDefaultReturnValueHandlers(); this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers); } }
public class ActMethodArgumentResolver implements HandlerMethodArgumentResolver { private static final String DEFAULT_VALUE = "body"; @Override public boolean supportsParameter(MethodParameter parameter) { /** 只有指定注解注释的参数才会走当前自定义参数解析器 */ return parameter.hasParameterAnnotation(RequestJsonParam.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { /** 获取参数注解 */ RequestJsonParam attribute = parameter.getParameterAnnotation(RequestJsonParam.class); /** 获取参数名 */ String name = attribute.value(); /** 获取指定名字参数的值 */ String value = webRequest.getParameter(StringUtils.isEmpty(name) ? DEFAULT_VALUE : name); /** 获取注解设定参数类型 */ Class> targetParamType = attribute.recordClass(); /** 获取实际参数类型 */ Class> webParamType = parameter.getParameterType() /** 以自定义参数类型为准 */ Class> paramType = targetParamType != null ? targetParamType : parameter.getParameterType(); if (ObjectUtils.equals(paramType, String.class) || ObjectUtils.equals(paramType, Integer.class) || ObjectUtils.equals(paramType, Long.class) || ObjectUtils.equals(paramType, Boolean.class)) { JSONObject object = JSON.parseObject(value); log.error("ActMethodArgumentResolver resolveArgument,paramName:{}, object:{}", paramName, JSON.toJSONString(object)); if (object.get(paramName) instanceof Integer && ObjectUtils.equals(paramType, Long.class)) { //入参:Integer 目标类型:Long result = paramType.cast(((Integer) object.get(paramName)).longValue()); }else if (object.get(paramName) instanceof Integer && ObjectUtils.equals(paramType, String.class)) { //入参:Integer 目标类型:String result = String.valueOf(object.get(paramName)); }else if (object.get(paramName) instanceof Long && ObjectUtils.equals(paramType, Integer.class)) { //入参:Long 目标类型:Integer(精度丢失) result = paramType.cast(((Long) object.get(paramName)).intValue()); }else if (object.get(paramName) instanceof Long && ObjectUtils.equals(paramType, String.class)) { //入参:Long 目标类型:String result = String.valueOf(object.get(paramName)); }else if (object.get(paramName) instanceof String && ObjectUtils.equals(paramType, Long.class)) { //入参:String 目标类型:Long result = Long.valueOf((String) object.get(paramName)); } else if (object.get(paramName) instanceof String && ObjectUtils.equals(paramType, Integer.class)) { //入参:String 目标类型:Integer result = Integer.valueOf((String) object.get(paramName)); } else { result = paramType.cast(object.get(paramName)); } }else if (paramType.isArray()) { /** 入参是数组 */ result = JsonHelper.fromJson(value, paramType); if (result != null) { Object[] targets = (Object[]) result; for (int i = 0; i < targets.length; i++) { WebDataBinder binder = binderFactory.createBinder(webRequest, targets[i], name + "[" + i + "]"); validateIfApplicable(binder, parameter, annotations); } } } else if (Collection.class.isAssignableFrom(paramType)) { /** 这里要特别注意!!!,集合参数由于范型获取不到集合元素类型,所以指定类型就非常关键了 */ Class recordClass = attribute.recordClass() == null ? LinkedHashMap.class : attribute.recordClass(); result = JsonHelper.fromJsonArrayBy(value, recordClass, paramType); if (result != null) { Collection
Định nghĩa của chú thích trình phân tích cú pháp tham số tùy chỉnh như sau. Một thuộc tính tương đối đặc biệt recordClass được xác định ở đây. Vấn đề mà nó giải quyết sẽ được thảo luận sau.
/** * Yêu cầu chú thích xử lý tham số json * @author wangpengchao01 * @date 2022-11-07 14:18 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interfaceRequestJsonParam { /** *Tên tham số yêu cầu ràng buộc*/ Giá trị chuỗi() "nội dung" mặc định /** *Có cần tham số không*/ boolean bắt buộc() mặc định sai; /** * Giá trị mặc định*/ Chuỗi defaultValue() mặc định ValueConstants.DEFAULT_NONE; /** * Loại bản ghi sau khi giải tuần tự hóa bộ sưu tập json*/ Lớp recordClass() mặc định null;
Đăng ký trình phân tích cú pháp tùy chỉnh vào vùng chứa Spring thông qua lớp cấu hình.
@Configuration public class WebConfig mở rộng WebMvcConfigurerAdapter { @Bean public static ActMethodArgumentResolver actMethodArgumentResolverConfigurer() { return new ActMethodArgumentResolver(); } @Override public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(actMethodArgumentResolverConfigurer()); } }
Tại thời điểm này, trình phân tích cú pháp tham số tùy chỉnh dựa trên chú thích hoàn chỉnh đã hoàn tất.
4. Tóm tắt
Việc hiểu nguyên lý phân tích tham số của Spring giúp sử dụng chính xác trình phân tích tham số của Spring. Nó cũng cho phép chúng ta thiết kế một trình phân tích tham số phù hợp với hệ thống của mình. Việc phân tích một số loại tham số phổ biến giúp giảm việc viết mã lặp lại, nhưng có một điều kiện tiên quyết ở đây. . Các tham số đầu vào của các loại phức tạp trong dự án của chúng ta phải được thống nhất và định dạng của các tham số được truyền ở giao diện người dùng cũng phải được thống nhất. Nếu không, việc thiết kế trình phân tích cú pháp tham số tùy chỉnh sẽ là một thảm họa và đòi hỏi nhiều công việc tương thích phức tạp. Thiết kế của bộ phân tích cú pháp tham số nên được đặt càng nhiều càng tốt khi bắt đầu phát triển dự án. Đối với các hệ thống có lịch sử phức tạp, nếu không có đặc tả thống nhất để phát triển giao diện thì không nên tùy chỉnh thiết kế của bộ phân tích cú pháp tham số.
Bài viết này chỉ là phần diễn giải giới thiệu về bộ phân tích tham số Spring. Tôi hy vọng nó sẽ hữu ích cho mọi người. Những sinh viên có nhu cầu hoặc sở thích như vậy có thể trao đổi, phê bình và cùng nhau tiến bộ! .
Cuối cùng, bài viết về thiết kế trình phân tích tham số tùy chỉnh của Spring kết thúc tại đây. Nếu bạn muốn biết thêm về thiết kế trình phân tích tham số tùy chỉnh của Spring, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. blog của tôi! .
Trước đây tôi đã làm cho trình tiêm dll trở nên dễ dàng nhưng tôi có Windows 7 và tôi đã làm nó trong C# và C++ và nó hoạt động tốt nhưng bây giờ khi tôi thử mã tương tự trong Windows 8 thì có vẻ như nó không đúng cách!
Tôi đang cố gắng tạo một phần tử có tên là bộ chia lõi không được dùng nữa trong phiên bản 1.0 vì nó đóng một vai trò quan trọng trong dự án của chúng tôi. Nếu bạn không biết bộ chia lõi làm gì, tôi có thể cung cấp một mô tả ngắn gọn.
Tôi có một số nhện khác nhau và muốn chạy tất cả chúng cùng một lúc. Dựa vào cái này và cái này, tôi có thể chạy nhiều nhện trong cùng một quy trình. Tuy nhiên, tôi không biết cách thiết kế hệ thống tín hiệu để dừng lò phản ứng sau khi tất cả các con nhện kết thúc. Tôi đã thử: cra
Có cách nào để dừng lò phản ứng xoắn khi đạt được một số điều kiện nhất định. Ví dụ: nếu một biến được đặt thành một giá trị nhất định, máy chủ phản ứng có nên dừng không? Câu trả lời hay nhất Lý tưởng nhất là bạn không đặt một biến thành một giá trị và dừng lò phản ứng mà thay vào đó hãy gọi
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js Liên kết trên xác định tệp js bên ngoài, tôi không biết về việc tiêm Angular-1.0.0rc9.js (trong
Tôi đang cố chạy một chức năng và đưa dịch vụ vào đó. Tôi nghĩ rằng điều này có thể được thực hiện dễ dàng bằng cách sử dụng $injector. Vì vậy, tôi đã thử cách sau (ví dụ đơn giản): Angular.injector().invoke( [ "$q
Trong Google Guice, tôi có thể sử dụng hàm createInjector để tạo bộ phun dựa trên nhiều mô-đun. Bởi vì tôi sử dụng GWT.create để khởi tạo phần chèn trong GoogleGin (trong
Tôi đang sử dụng liên kết cấu hình trong giải pháp ASP.NET Core 1.1. Về cơ bản, tôi có một số mã đơn giản để liên kết trong phần "Khởi động dịch vụ cấu hình" như thế này: s
Tôi gặp một số vấn đề khi thiết lập initBinder trong Spring MVC. Tôi có ModelAttribution đôi khi có một trường được hiển thị. lớp công khai Mẫu { riêng tư
Làm cách nào để viết một chất kết dính mô hình tùy chỉnh cho một mô hình phức tạp chứa tập hợp các đối tượng đa hình? Tôi có cấu trúc mô hình tiếp theo: public class CustomAttributionValueViewModel { publi
Xin chào, tôi đang cố gắng triển khai phương pháp mở rộng mà tôi đã tìm thấy trong bài viết này cho một trình tiêm đơn giản, vì nó không hỗ trợ đăng ký một hàm tạo cụ thể ngay từ đầu. Theo bài viết này, tôi cần sử dụng một đại biểu giả
Xin chào, tôi muốn tự động đăng ký các phụ thuộc của mình. Những gì tôi có bây giờ là: giao diện công cộng IRepository trong đó T: lớp giao diện công cộng IFolderReposi
Tôi đang sử dụng trình tạo mã Matlab. Không thể bao gồm hướng dẫn về phong cách viết mã. Đó là lý do tại sao tôi đang tìm kiếm một công cụ để "định hình lại", đổi tên và định dạng lại mã được tạo theo: Tính năng, quy ước biểu ngữ, quy ước biểu ngữ tệp, quy ước đặt tên, v.v.
Tôi đã phát triển một công cụ có thể thay đổi giao diện của một số chương trình. Để làm được điều này tôi cần thêm một dll vào một số quy trình. Bây giờ về cơ bản tôi sử dụng phương pháp này. Vấn đề thường là mọi người không thể tiêm dll vì chúng.
Tôi muốn viết một ứng dụng java bằng cách sử dụng swing, spring và hibernate. Tôi muốn sử dụng một chất kết dính dữ liệu để điền vào gui các giá trị của Bean và tôi cũng muốn nó phản ánh gui
Tôi có mã này và khi cả hai con nhện kết thúc thì chương trình vẫn chạy. #!C:\Python27\python.exe từ lò phản ứng nhập khẩu Twisted.internet từ Scrapy.cr
Điểm chính là khung thử nghiệm Spring Batch (v2) có JobLauncherTestUtils.setJob với chú thích @Autowired. Bộ thử nghiệm của chúng tôi có nhiều nhà cung cấp lớp Công việc. Bởi vì lớp học này không
Tôi là một lập trình viên xuất sắc, rất giỏi!