一、背景
在使用SAP Webide进行Fiori应用开发时,很多场景下,需要根据汉字去定位代码位置。比如想根据中文注释去直接定位需要改动的逻辑在项目的哪个文件中的哪行代码,又或者需要改动标签里的文字描述。但是Webide不支持中文检索文件,效果如下图所示。
目前SAP也没有修复Webide不能检索文件中的汉字功能,导致许多Fiori顾问在碰到检索中文时,只能点开项目中的每个文件,依次进行搜索。
温馨提示:解决问题极速版直接跳到目录三
二、问题定位
老规矩,定位Bug必然少不了F12快捷键打开前台调试窗口,并切换到network网络页签。在我们输入完要检索的汉字后点击Serach按钮或者回车,此时我们能看到有一个Get请求被触发了,如下图所示。
看到这个Get请求里面的内容,我们脑海里要有个概念,这个已经不是单独请求某个本地文件了,是真的调用了一个后台服务。(因为Webide环境基于java jdk,然后里面又有很多java的jar包,很容易看出这是调用了一个Java的Servlet服务。)前台通过encodeURIComponent把中文给重新编码传给后台,此时我们应该去Webide里找找后台看是怎么处理这个被编码的中文。
在Webide的根目录,有个artifacts.xml文件,里面有很多Jar包配置项生成在这,我们可以试着搜搜search相关的,结果还真有一个很相像的。
这个jar包直接就在Webide根目录下的plugins文件夹中,我们直接把刚刚找到的org.eclipse.orion.server.search_8.0.0.sap-48.jar包拖到jd-gui.exe工具中(常见的反编译java代码工具),得到如下图界面,在plugin.xml中也能进一步看到配置的别名/filesearch是前台调用的那个Servlet。
直接到SearchServlet.class的get实现方法doGet中。
接着点击buildSearchOptions方法跳到处理请求参数的方法中,我们看到有通过方法URLDecoder.decode(term, "UTF-8")去处理接收到的搜索参数,看着没毛病。
此时博主也开始怀疑人生,直接摆烂不思考了,把这段处理逻辑单独拎出来,单独测试执行文字转码效果。(把其他处理逻辑都删了,保留了关键的判断语句,主要是为了看最后得到的字符串是否正确)
package com.cn.hsq;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Parm {
private static final List<String> FIELD_LIST = Arrays
.asList("Name,NameLower,Length,Directory,LastModified,Location,Path,RegEx,CaseSensitive".split(","));
public static void main(String[] args) {
String queryString = "%E4%B8%AD%E6%96%87+NameLower:*+Location:/file/senqi-OrionContent/*&rows=300";
if (queryString.length() > 0) {
List<String> terms = new ArrayList<String>(Arrays.asList(queryString.split("[\\s\\+]+")));
while (!terms.isEmpty()) {
String term = terms.remove(0);
System.out.println("原始:" + term);
if (term.length() == 0)
continue;
if (isSearchField(term)) {
if (term.startsWith("NameLower:")) {
continue;
}
if (term.startsWith("Location:")) {
continue;
}
if (term.startsWith("Name:")) {
continue;
}
if (term.startsWith("RegEx:")) {
continue;
}
if (term.startsWith("CaseSensitive:"))
continue;
}
try {
term = URLDecoder.decode(term, "UTF-8");
System.out.println("转换后的:" + term);
} catch (UnsupportedEncodingException unsupportedEncodingException) {
}
}
}
}
public static boolean isSearchField(String term) {
for (String field : FIELD_LIST) {
if (term.startsWith(String.valueOf(field) + ":"))
return true;
}
return false;
}
}
在脑袋停止转动的时候执行了这个程序,发现最后得到的确实是我们前台输入的检索中文条件。此时脑袋懵了,前台传的没问题,后台也传的没问题,还能是什么问题?
这时想到问Chatgpt了,在包括贴前后台代码让分析无果后,我接着问还可能是什么原因。看到答案2直接眼前一亮,确实该怀疑Webide的服务配置了。
然后我就接着把Webide的配置仍给AI,试了给出的答案果然有一个有用。
三、解决步骤
在Webide的根目录,编辑配置文件orion.ini,在最下面追加一条如下配置。
-Dfile.encoding=UTF-8
四、效果展示
在我们重启完orion.exe服务器后,网页重新打开Webide,测试检索文件中的汉字效果果然奏效了。虽然解决方案简单,但是博主还是花了挺长时间的。
五、附言
这个问题是博主将Webide这个系列文章的第一篇转载到朋友圈后,有好友来询问的。当时没回,我在想,要是说能解决,那方案是什么,当时还不知道;要是说不能,都没抽时间去研究,怎么就能不假思索的说不行;要是说我看看,那不得被盯着进度,博主目前也只是抽时间研究研究,白天还是正常工作,所以不能保证时间多久,佛系研究,佛系更新。
👍点赞,您的支持是我创作的动力!
⭐️收藏,您的青睐是我前行的方向!
✏️评论,您的意见是我成长的财富!