Spring REST配置指南与问题总结

oh-my-openagent:开源AI智能体框架的设计、实现与实战指南 AI智能体(Agent)作为当前人工智能领域的关键技术,其核心在于赋予大语言模型(LLM)自主规划、工具调用与环境交互的能力,从而解决复杂任务。其技术原理通常围绕任务分解、记忆管理、工具编排等模块构建,通过框架化的设计降低开发门槛,实现从感知到决策再到执行的闭环。这一架构在自动化办公、数据分析、智能客服等场景中展现出巨大工程价值。本文以开源框架oh-my-openagent为例,深入探讨了其模块化设计,特别是工具系统的抽象与扩展机制,以及记忆管理如何实现短期对话与长期知识的结合。通过构建从天气查询到数据分析 阅读详情

下一版本的rapid-framework需要集成spring RESTful URL。最近JavaEye的badqiu对于如何搭建spring RESTful URL进行了研究,并总结问题如下。

springmvc 3.0 中增加 RESTful URL功能,构造出类似javaeye现在的URL。比如如下URL

 
  1. /blog/ 1   HTTP GET =>    得到id =  1 的blog  
  2. /blog/ 1   HTTP DELETE => 删除 id =  1 的blog  
  3. /blog/ 1   HTTP PUT  =>   更新id =  1 的blog  
  4. /blog     HTTP POST =>   新增BLOG 

以下详细解一下spring rest使用.

首先,我们带着如下两个问题查看本文。

1. 如何在java构造没有扩展名的RESTful url,如 /forms/1,而不是 /forms/1.do

2. 浏览器的form标签不支持提交delete,put请求,如何曲线解决

springmvc rest 实现

springmvc的resturl是通过@RequestMapping 及@PathVariable annotation提供的,通过如@RequestMapping(value="/blog /{id}",method=RequestMethod.DELETE)即可处理/blog/1 的delete请求.

 
  1. @RequestMapping (value= "/blog/{id}" ,method=RequestMethod.DELETE)  
  2. public  ModelAndView delete( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response) {  
  3.  blogManager.removeById(id);  
  4.   return   new  ModelAndView(LIST_ACTION);  
  5. }  
  6.   

@RequestMapping @PathVariable如果URL中带参数,则配合使用,如

 
  1. @RequestMapping (value= "/blog/{blogId}/message/{msgId}" ,method=RequestMethod.DELETE)  
  2. public  ModelAndView delete( @PathVariable ( "blogId" ) Long blogId, @PathVariable ( "msgId" ) Long msgId,HttpServletRequest request,HttpServletResponse response) {  
  3. }  
  4.   

spring rest配置指南

1. springmvc web.xml配置

 
  1. <  !-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -- >  
  2. <   servlet-mapping >  
  3.   <   servlet-name > default <  /servlet-name >  
  4.   <   url-pattern > /static/* <  /url-pattern >  
  5. <  /servlet-mapping >  
  6. <   servlet >  
  7.      <   servlet-name > springmvc <  /servlet-name >  
  8.      <   servlet-class > org.springframework.web.servlet.DispatcherServlet <  /servlet-class >  
  9.      <   load-on-startup > 1 <  /load-on-startup >  
  10. <  /servlet >  
  11.  
  12. <  !-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css -- >  
  13. <   filter >  
  14.   <   filter-name > UrlRewriteFilter <  /filter-name >  
  15.   <   filter-class > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter <  /filter-class >  
  16.   <   init-param >  
  17.        <   param-name > confReloadCheckInterval <  /param-name >  
  18.        <   param-value > 60 <  /param-value >  
  19.       <  /init-param >  
  20.   <   init-param >  
  21.               <   param-name > logLevel <  /param-name >  
  22.               <   param-value > DEBUG <  /param-value >  
  23.          <  /init-param >        
  24. <  /filter >  
  25. <   filter-mapping >  
  26.   <   filter-name > UrlRewriteFilter <  /filter-name >  
  27.   <   url-pattern > /* <  /url-pattern >  
  28. <  /filter-mapping >  
  29.  
  30. <  !-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 -- >  
  31. <   servlet-mapping >  
  32.      <   servlet-name > springmvc <  /servlet-name >  
  33.      <   url-pattern > / <  /url-pattern >  
  34. <  /servlet-mapping >  
  35.  
  36. <  !-- 浏览器不支持put,delete等method,由该filter将/blog? _method = delete 转换为标准的http delete方法 -- >  
  37. <   filter >  
  38.   <   filter-name > HiddenHttpMethodFilter <  /filter-name >  
  39.   <   filter-class > org.springframework.web.filter.HiddenHttpMethodFilter <  /filter-class >  
  40. <  /filter >  
  41.  
  42. <   filter-mapping >  
  43.   <   filter-name > HiddenHttpMethodFilter <  /filter-name >  
  44.   <   servlet-name > springmvc <  /servlet-name >  
  45. <  /filter-mapping >  

2. webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活@RequestMapping annotation

 
  1. <   bean   class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  2. <   bean   class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  

完整配置

 
  1. <   beans   default-autowire = "byName"     >  
  2.  
  3.   <  !-- 自动搜索@Controller标注的类 -- >  
  4.   <   context:component-scan   base-package = "com.**.controller" />  
  5.    
  6.      <   bean   class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  7.  
  8.      <   bean   class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  9.  
  10.      <  !-- Default ViewResolver -- >  
  11.      <   bean   id = "viewResolver"   class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >  
  12.          <   property   name = "viewClass"   value = "org.springframework.web.servlet.view.JstlView" />  
  13.          <   property   name = "prefix"   value = "/pages" />  
  14.          <   property   name = "suffix"   value = ".jsp" > <  /property >  
  15.      <  /bean >  
  16.       
  17.      <   bean   id = "messageSource"   class = "org.springframework.context.support.ResourceBundleMessageSource"   p:basename = "i18n/messages" />  
  18.  
  19.      <  !-- Mapping exception to the handler view -- >  
  20.      <   bean   id = "exceptionResolver"   class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >  
  21.       <  !-- to /commons/error.jsp -- >  
  22.          <   property   name = "defaultErrorView"   value = "/commons/error" />  
  23.          <   property   name = "exceptionMappings" >  
  24.              <   props >  
  25.              <  /props >  
  26.          <  /property >  
  27.      <  /bean >  
  28.           
  29. <  /beans >  
  30.    

3. Controller编写

 
  1. /**  
  2.  * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一,  
  3.  * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new  
  4.  */  
  5. @Controller  
  6. @RequestMapping ( "/userinfo" )  
  7. public   class  UserInfoController  extends  BaseSpringController{  
  8.   //默认多列排序,example: username desc,createTime asc  
  9.   protected   static   final  String DEFAULT_SORT_COLUMNS =  null ;   
  10.    
  11.   private  UserInfoManager userInfoManager;  
  12.    
  13.   private   final  String LIST_ACTION =  "redirect:/userinfo" ;  
  14.    
  15.   /**   
  16.   * 通过spring自动注入  
  17.   **/  
  18.   public   void  setUserInfoManager(UserInfoManager manager) {  
  19.    this .userInfoManager = manager;  
  20.  }  
  21.    
  22.   /** 列表 */  
  23.   @RequestMapping  
  24.   public  ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {  
  25.   PageRequest< Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);  
  26.    //pageRequest.getFilters(); //add custom filters  
  27.     
  28.   Page page =  this .userInfoManager.findByPageRequest(pageRequest);  
  29.   savePage(page,pageRequest,request);  
  30.    return   new  ModelAndView( "/userinfo/list" , "userInfo" ,userInfo);  
  31.  }  
  32.    
  33.   /** 进入新增 */  
  34.   @RequestMapping (value= "/new" )  
  35.   public  ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo)  throws  Exception {  
  36.    return   new  ModelAndView( "/userinfo/new" , "userInfo" ,userInfo);  
  37.  }  
  38.    
  39.   /** 显示 */  
  40.   @RequestMapping (value= "/{id}" )  
  41.   public  ModelAndView show( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  42.   UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  43.    return   new  ModelAndView( "/userinfo/show" , "userInfo" ,userInfo);  
  44.  }  
  45.    
  46.   /** 编辑 */  
  47.   @RequestMapping (value= "/{id}/edit" )  
  48.   public  ModelAndView edit( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  49.   UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  50.    return   new  ModelAndView( "/userinfo/edit" , "userInfo" ,userInfo);  
  51.  }  
  52.    
  53.   /** 保存新增 */  
  54.   @RequestMapping (method=RequestMethod.POST)  
  55.   public  ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo)  throws  Exception {  
  56.   userInfoManager.save(userInfo);  
  57.    return   new  ModelAndView(LIST_ACTION);  
  58.  }  
  59.    
  60.   /** 保存更新 */  
  61.   @RequestMapping (value= "/{id}" ,method=RequestMethod.PUT)  
  62.   public  ModelAndView update( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response)  throws  Exception {  
  63.   UserInfo userInfo = (UserInfo)userInfoManager.getById(id);  
  64.   bind(request,userInfo);  
  65.   userInfoManager.update(userInfo);  
  66.    return   new  ModelAndView(LIST_ACTION);  
  67.  }  
  68.    
  69.   /** 删除 */  
  70.   @RequestMapping (value= "/{id}" ,method=RequestMethod.DELETE)  
  71.   public  ModelAndView delete( @PathVariable  Long id,HttpServletRequest request,HttpServletResponse response) {  
  72.   userInfoManager.removeById(id);  
  73.    return   new  ModelAndView(LIST_ACTION);  
  74.  }  
  75.  
  76.   /** 批量删除 */  
  77.   @RequestMapping (method=RequestMethod.DELETE)  
  78.   public  ModelAndView batchDelete(HttpServletRequest request,HttpServletResponse response) {  
  79.   String[] items = request.getParameterValues( "items" );  
  80.    for ( int  i =  0 ; i <  items.length; i++) {  
  81.    java.lang.Long id =  new  java.lang.Long(items[i]);  
  82.    userInfoManager.removeById(id);  
  83.   }  
  84.    return   new  ModelAndView(LIST_ACTION);  
  85.  }  
  86.    
  87. }  
  88.    

上面是rapid-framework 新版本生成器生成的代码,以后也将应用此规则,rest url中增删改查等基本方法与Controller的方法映射规则

 
  1. /userinfo    => index()  
  2. /userinfo/new  => _new()  
  3. /userinfo/{id}  =>  show ()  
  4. /userinfo/{id}/edit   => edit()  
  5. /userinfo  POST  => create()  
  6. /userinfo/{id}  PUT => update()  
  7. /userinfo/{id}  DELETE => delete()  
  8. /userinfo  DELETE  => batchDelete()  

注(不使用 /userinfo/add  => add() 方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)

4. jsp 编写

 
  1. <   form:form   action = "${ctx}/userinfo/${userInfo.userId}"   method = "put" >  
  2. <  /form:form >  
  3.  将生成一个hidden的 _method = put ,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务端将post请求改为put请求  
  4.  
  5. <   form   id = "userInfo"   action = "/springmvc_rest_demo/userinfo/2"   method = "post" >  
  6.   <   input   type = "hidden"   name = "_method"   value = "put" />  
  7. <  /form >  
  8.    

另外一种方法是你可以使用ajax发送put,delete请求.

5. 静态资源的URL重写

如上我们描述,现因为将default servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.

如 /foo.gif, 现在访问该文件将是 /static/foo.gif.

那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 http://tuckey.org/urlrewrite/ , 重写规则如下

 
  1. <   urlrewrite >  
  2.      <  !-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 / foo.gif  = >  /static/foo.gif -- >  
  3.      <   rule >  
  4.       <   condition   operator = "notequal"   next = "and"   type = "request-uri" > .*.jsp <  /condition >  
  5.       <   condition   operator = "notequal"   next = "and"   type = "request-uri" > .*.jspx <  /condition >  
  6.          <   from > ^(/.*/..*)$ <  /from >  
  7.          <   to > /static$1 <  /to >  
  8.      <  /rule >  
  9. <  /urlrewrite >  
  10.     

另笔者专门写了一个 RestUrlRewriteFilter来做同样的事件,以后会随着rapid-framework一周发布. 比这个更加轻量级.

并且该代码已经贡献给spring,不知会不会在下一版本发布。

 

http://developer.51cto.com/art/200909/153054.htm

 

 

 

 

Spring REST 配置CSRF防护 Spring REST 配置CSRF防护内容从以下几个方面展开 什么是CSRF防护 如何运用CSRF进行防御(WEB) 如何将CSRF防御,运用到REST中 1.什么是CSRFCSRF 攻击简单来说,是多Tab页面浏览器的一个安全漏洞,比如你正在访问A网站,此时如果浏览器有你的cookie,并且session没有过期,此时你去访问B网站,那么B网站可以直接调用A网站的接口,而A网站则认为是你本人进行 阅读详情

相关推荐

Spring Boot示例 - 2. 使用Spring Boot + Spring Data REST + Spring Data JPA构建符合HATEOAS规范的REST应用

一、概述一般使用Spring MVC + Spring Data JPA即可构建REST服务,但是这种方式要完整实现Controller层,Service层和Repository层,需要编写很多样板代码,诸如注释,XML配置等。 使用Spring Data REST可以轻松构建超媒体驱动(hypermedia-driven)的REST服务。 Spring Data REST本身是个Spring

qiutongyeluo的专栏 8400

开源项目分享——oh-my-openagent (Oh My OpenCode)

ultrawork. Done.”核心特点多模型编排: 同时使用 Claude、GPT、Kimi、GLM 等多个模型,各取所长专业化 Agent 团队: Sisyphus(主编排)、Hephaestus(深度工作)、Prometheus(规划)、Oracle(架构)、Librarian(文档)等专业 Agent工业级编辑工具: Hash 锚定编辑、LSP 支持、AST-Grep 代码搜索并行后台代理: 可同时运行 5+ 个后台 Agent 协作Claude Code 兼容。

成长之路 3590

Spring REST Docs 简易教程

Spring REST Docs 简易教程 本文相当于官方文档的部分翻译版,完整文档请参考Spring REST Docs 官方文档 ,本文涉及内容: 简介 Spring REST Docs 整合 为API编写文档 配置 Asciidoctor 使用简介 Demo 源码...

anxpp的博客 8255

Oh My OpenAgent (OMO) 介绍与使用指南

《Oh My OpenAgent (OMO) 多模型智能体编排框架指南》 OMO是一个专为OpenCode设计的智能体编排框架,可将单一AI代理转变为协同工作的虚拟开发团队。核心架构包含Sisyphus主编排器和多个专业化智能体(Prometheus战略规划、Atlas任务执行等),支持多模型路由和并行工作。 框架提供40+生命周期钩子,哈希锚定编辑技术使编辑成功率提升10倍,Ultrawork模式可实现一键自动化开发。典型应用场景包括新项目开发、代码重构和完整功能实现,通过直观命令如"ultra

k0933的博客 1075

oh-my-openagent:开源AI智能体框架,快速构建企业级AI应用

AI智能体是能够感知环境、决策并执行任务的软件程序,其核心原理是通过大语言模型(LLM)驱动,结合工具调用与工作流编排,完成复杂任务。这一技术为开发者提供了将AI能力工程化落地的有效路径,广泛应用于企业知识库问答、自动化编程助手、多模态交互等场景。oh-my-openagent作为一个开源框架,通过模块化设计和工作流引擎,封装了智能体开发的通用模式,显著降低了开发门槛。该框架支持自定义工具集成和提示词模板化管理,便于开发者快速构建如代码分析、文档处理等实际应用,并内置了记忆系统和安全考量,适合需要高效实现A

weixin_27653327的博客 898

开源AI智能体框架oh-my-openagent:从原理到实战的开发者指南

AI智能体(Agent)作为能够感知环境、进行决策并执行动作以完成目标的AI程序,其核心原理在于将大语言模型(LLM)的推理能力与外部工具的执行能力相结合。这种架构通过模块化设计,将智能体分解为Agent、Tool、Memory和Orchestrator等核心组件,实现了任务规划、工具调用与记忆管理的自动化工作流。其技术价值在于显著降低了构建复杂AI应用的门槛,使开发者能够聚焦业务逻辑而非底层基础设施。在应用场景上,智能体框架广泛应用于自动化办公助手、代码分析机器人、智能客服等需要多步骤推理与执行的领域。本

weixin_28706423的博客 799

开源项目 gs-consuming-rest 使用指南

开源项目 gs-consuming-rest 使用指南 项目基础介绍和主要编程语言 gs-consuming-rest 是一个Spring Guides项目,旨在向开发者演示如何使用Spring框架中的RestTemplate来消费RESTful Web服务。该教程引导用户通过构建一个应用,该应用能够从***获取一个随机的Spring Boot名言。 该项目主要使用的编程语言是Java,并且依赖于...

gitblog_00461的博客 707

后端领域Spring Data REST的配置与使用指南

Spring Data REST是Spring Data项目的一部分,其主要目的是简化RESTful API的开发过程。在现代后端开发中,RESTful API已经成为了一种标准的通信方式,用于不同系统之间的数据交互。Spring Data REST可以根据Spring Data仓库接口自动创建RESTful端点,大大减少了开发者编写样板代码的工作量。本文的范围涵盖了Spring Data REST的各个方面,从基础的配置到高级的使用技巧,包括如何与数据库交互、如何自定义API行为等。

架构师的AI之路,分享AI应用开发架构的学习与实践。 734

Flowable 工作流引擎REST API 与 Spring Boot 整合指南

前言 工作流引擎,现在Java世界使用的主流是Activiti 和 Flowable 这两款。Flowable 是Activiti 的fork 分支,所以用法其实差不多。 最理想的状态,引擎能够提供一个rest目录前言依赖与Spring boot 整合增加RestResponseFactory 和 ContentTypeResolver 提供rest服务解决中文乱码使用测试 依赖 flowable...

Lincoln 的专栏 7253

Spring REST客户端开发实践指南

是 Spring 框架提供的一个同步 HTTP 客户端,广泛应用于发送 HTTP 请求和接收 HTTP 响应。它简化了与 RESTful 服务交互的过程,使开发者可以轻松地调用远程服务。尽管在响应式编程流行的时代,仍然是许多现有项目的首选,特别是在需要稳定性和兼容性的生产环境中。REST(Representational State Transfer,表现层状态转换)是一种软件架构风格,其核心原则是客户端-服务器分离、无状态交互、使用统一的接口。

weixin_42610010的博客 799

狗都能看懂的MAML原理讲解和代码实现

meta-leaning指的是元学习,元学习是深度学习的一个分支,一个好的元模型(meta-learner)应该具备对新的、少量的数据做出快速而准确的学习。通俗的来讲, 对于人来说,给几张橘猫的图片让看一下,再给你几张没见过的英短猫图片,你一定能很快识别出来都是猫。但是对于神经网络来说,并非如此。如果让一个小汽车分类网络去识别不同的大货车,那效果肯定很差。而传统的CNN网络都是输入大量的数据,然后进行分类的学习。但是这样做的问题就是,神经网络的通用性太差了,根本达不到“智能”的标准。而人类的认知系统,可以通

个人学习笔记 6万+

spring-rest-service-oauth完全解析:构建安全REST服务的终极指南

spring-rest-service-oauth是一个基于Spring Boot和Spring Security OAuth构建的简单OAuth保护REST服务,它为开发者提供了快速实现安全认证的解决方案。本指南将带你全面了解如何使用这个项目构建安全可靠的REST服务。 ## 项目核心架构概览 该项目采用了Spring生态系统的最佳实践,主要通过两个核心配置类实现OAuth2安全认证: -

gitblog_00329的博客 822

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5722

Spring REST Docs 常见问题解决方案

Spring REST Docs 是一个用于生成 RESTful 服务文档的开源项目。它通过结合手动编写的 Asciidoctor 内容和使用 Spring MVC Test 框架自动生成的示例,帮助开发者创建易于阅读的用户指南。Spring REST Docs 的主要编程语言是 Java,它与 Spring 框架紧密集成,适用于构建基于 Spring 的 RESTful API 文档。 ## ...

gitblog_00153的博客 1145

嘉立创EDA实战:4层板叠层设计避坑指南(附阻抗计算技巧)

本文详细解析了嘉立创EDA在4层PCB叠层设计中的实战技巧与避坑指南,涵盖经典叠层方案对比、介质厚度选择、电源系统设计及高速信号完整性优化。特别介绍了阻抗计算工具的应用,帮助工程师在高速电路设计中实现性能与成本的最佳平衡。

sea99的博客 967

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 335

(九)Spring Rest

Spring REST 使得构建 RESTful Web 服务变得简单而直观。通过使用 Spring 提供的注解和功能,开发人员可以快速创建强大的 REST API,同时享受 Spring 的强大支持。通过遵循 RESTful 设计原则、合理使用 HTTP 方法、路径和状态码,开发人员能够构建出简洁、可维护的 API。

qq_50847694的博客 957

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

shufawangzhang的博客 3988

Spring Boot 访问数据 REST 项目常见问题解决方案

Spring Boot 访问数据 REST 项目常见问题解决方案 项目基础介绍 该项目是一个基于 Spring Boot 的示例项目,旨在演示如何使用 Spring Data REST 来访问和操作数据。Spring Data REST 是 Spring Data 项目的一部分,它允许开发者通过 RESTful API 暴露数据存储,而无需编写大量的 REST 控制器代码。该项目的主要编程语言是 ...

gitblog_01046的博客 878

【AVRCP】规范精讲[19]: 媒体属性全解析,让你的蓝牙设备显示完整歌曲信息

AVRCP协议中的媒体属性是蓝牙音频设备传输歌曲元数据的关键,包含标题、艺术家、专辑等32位ID标识的键值对信息。规范要求字符串属性必须使用UTF-8编码,但乱码问题频发(如中文显示异常),主因是设备未遵循编码标准或使用GBK等非规范格式。常见问题包括信息不全(仅显示标题)、封面缺失(因带宽限制或格式不支持)及更新延迟(通知机制未启用)。解决方案包括强制UTF-8编码、优化封面大小(如300x300像素JPEG)、主动请求缺失属性。Android示例代码展示了通过广播接收器解析媒体属性的方法。

byte轻骑兵的技术小窝 1万+

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

黑猫带你学eMMC协议第7篇:全网最全emmc写保护详解(write protect) 黑猫带你学eMMC协议第8篇:emmc可靠写详解(Write Reliability) 黑猫带你学eMMC协议第9篇:emmc的分区配置(partitioning) 黑猫带你学eMMC协议第10篇:eMMC命令队列详解(CMDQ) 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim…) 黑猫带你学eMMC协议第12篇:

黑猫奥利奥的博客 2万+

Spring REST Docs API 规范插件使用指南

Spring REST Docs API 规范插件使用指南 项目介绍 Spring REST Docs API Spec 是一个旨在增强 Spring REST Docs 功能的扩展,允许开发者生成 OpenAPI 和 Postman Collection 规范文件作为其RESTful API文档的输出格式。此项目特别适合那些寻求以测试驱动的方式创建精确API文档的团队,避免在生产代码中过度使用注...

gitblog_00405的博客 907

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

在游戏发展史上,有些游戏以其简单而耐玩的特性,深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一,它曾经在4399等游戏平台上掀起了一股游戏热潮。这款游戏不仅给无数玩家带来了欢乐,还让他们体验到了挖掘金矿的刺激与乐趣。在这个项目中,我们将花费半天的时间,利用Unity引擎,重新打造这款经典小游戏。通过复刻《黄金矿工》,我们不仅是在向童年的回忆致敬,更是在挖掘游戏设计的精髓。在这个过程中,我们将学习如何实现游戏的核心玩法,设计简洁而有效的游戏机制。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2902

【序列晋升】39 Spring Data REST 的优雅实践,让数据交互更符合 REST 规范

Spring Data REST是Spring生态系统中一个功能强大的框架,它能够将Spring Data仓库自动转换为符合RESTful风格的API,同时遵循HATEOAS原则。

愚者Turbo的博客 1281

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring Data REST

一 点睛 1 什么是Spring Data REST Spring Data JPA是基于Spring Data的Repository之上,可以将Repository自动输出为REST资源。目前Spring Data REST支持将Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data Gemfire以及Spring ...

实践求真知 1488

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Data Rest 指南

Spring Data Rest 一.Restful简介 REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一

ToBeMaybe_的博客 3096

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 使用Spring 2.5 和 Hibernate 3.2 开发MVC Web程序(基于annotation特性)
下一篇: Spring2.5注释语法(上)——Spring2.5注释驱动的IoC
sukyle
博客等级 码龄18年 41粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值