Java, JavaScript

次常用语言,J2ME时代常用,Android系统常用

关于spring框架使用websocket + stomp协议时的发消息顺序问题

还是继续上一篇stomp的问题,这次是在实际使用中又有了新发现,那就是java后端向前端发送stomp消息时,存在底层异步操作造成的消息顺序不确定性问题,如下:

    @Autowired
    SimpMessageSendingOperations messagingTemplate;

    @MessageMapping("/create")
    @SendToUser("/queue/reply")
    public ReplyDTO create(@Payload CreateDTO msg, SimpMessageHeaderAccessor accessor) throws Exception {
        String userId = getUserId(accessor);
        if (userId.isEmpty())
            return buildNotLoggedInReply(accessor);
        int createId = myService.create(userId, msg.getTypeName());
        CreateInfo ci = myService.info(createId);
        String infoStr = new ObjectMapper().writeValueAsString(ci);

        messagingTemplate.convertAndSendToUser(
                Objects.requireNonNull(accessor.getSessionId()),
                "/queue/response",
                buildOkResp(accessor),
                createHeaders(accessor.getSessionId())
        );

        return buildReply(accessor, infoStr);
    }
Continue reading…

cannot deserialize from Object value (no delegate- or property-based Creator)

最近研究springstomp协议框架,上到消息订阅、发送时一开始用的普通String,没有任何问题,都可以跑通,后来上DTO数据对象时,遇到了标题上的问题,查了下发现是框架层在调用jackson自动反序列化json为DTO对象时报的错,很久没用java,都忘记了,参考下面链接的说明

https://blog.csdn.net/weixin_39827145/article/details/89314433

意识到jackson反序列化时默认的行为是需要class的无参构造,之后再处理各个属性对应到json key的value,而出问题是的DTO class上用的lombok标记是“@AllArgsConstructor”,只生成了全成员变量参数构造,因此导致了此问题,把接收stomp请求,用于对应@Payload的class换成@NoArgsConstructor(当然,一般还要带上@Getter,用于成员变量的访问)后,问题解决,接收到stomp请求后,成功传递到了controller的对应处理方法中。小问题连带了一个小知识点,记录一下。

AndroidStudio制作Unity 2020.3插件的新坑

在Unity还是4.x 5.x的时代,为了做一些安卓原生功能,如获取电量,wifi信号强度等功能,或者是为了接入某些原生SDK,经常需要制作Unity的Android原生插件,当时基本就是基于Unity的安卓classes.jar制作plugin.jar,然后自定义AndroidManifest.xml,一起放到Unity项目的Assets/Plugins/Android下,然后Build安卓apk即可,简单粗暴。最近又有了做安卓插件的需求,这次换上了2020版的Unity,本以为还是当年熟悉的操作,没成想来了个大人,时代变了,踩了不少新坑:

首先,当年好像还是用Eclipse做Android开发,现在早就是Android Studio的天下了,我用的版本是:Chipmunk 2021.2.1 Patch 2,按着网上找到的教程(对,很久没用了,都快忘了怎么建项目了),创建了Android Library项目,又从Unity的“D:\Program Files\Unity\Hub\Editor\2020.3.30f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes”位置,拿到了熟悉的classes.jar,注意这里有一些变量,比如mono,现在还有了il2cpp的选择,Release对应还有Debug,根据实际情况进行选择吧。然后,随便写了几个简单的静态方法,Unity C#里调用了下,nice,没有问题,于是开始进行下一步,自定义入口activity,然后就开始踩坑了:

Continue reading…

Android Studio使用override自动生成方法形参名错误问题

使用Android Studio写Java,Kotlin代码时,经常会用到Ctrl+O来实现接口的方法,今天偶然发现AS自动添加的代码变成了这样:

val textWatcher = object: TextWatcher {

    override fun afterTextChanged(p0: Editable?) {
    }

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    }

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    }
}

虽然不影响功能,但是看起来就很费劲了,形参名不具有自解释性了,记得之前一直是没问题的,简单查了下发现,原来是之前更新了platform sdk后,没有选择同时安装source,在SDK Manager中把当前正在用的target api版本对应的source安装上,再次执行同样操作就可以了:

Continue reading…

Android Studio的Build Output中文输出乱码(菱形问号)问题的解决方法

Win10系统(Mac上貌似没问题),Android Studio版本4.x,不知为何,Build Output中的中文,包括编译器提示、以及错误代码中的中文,都会显示为如下的乱码,菱形问号:

可以猜到javac在使用中文输出各种信息,这点可以通过使用gradle命令在单独打开的命令行中执行build则可以看到正确的中文输出来验证,因此尝试过用 “-Duser.language=en” 等改变jdk locale的方式来使编译器输出英文信息,但是这样虽然可以看到编译错误,但是本身代码里的中文还是会显示成乱码

最后终于发现了问题的根源,参考这里:

Continue reading…

JetBrains IntelliJ IDEA从2018更新到2019后无法卸载的问题

Uninstall hasn’t detected folder of XXX installation…

博主的IDEA是从2018一路升上来,最近出了2020,并且还用上了JB的Toolbox,看着Manually installed有点强迫症发作,于是尝试卸载掉后用Toolbox重新安装,结果就发现了上面写到的错误提示这个坑!

参考 https://youtrack.jetbrains.com/issue/PY-35047 可行的解决方法如下:

Continue reading…

IDEA maven unresolved dep问题的一种解决方法

最近在用IntelliJ IDEA 2020时遇到一个奇怪的问题,就是maven同步通过,但是编译时就是有依赖包找不到,提示:“maven unresolved dep XXX”,尝试过各种clean,reimport maven都无法解决问题,最后发现其实是之前某次更包时wifi断了下,导致包下错了,后面就一直陷入这种僵局了…

解决方法是,到“C:\Users\XXXX\.m2\repository”中手动删除找不到的dep包,然后再重新更新maven依赖就可以了。不是什么大问题,但错误提示信息很容易造成误导。

解决jest的”too many open files, watch”问题(Mac OSX)

在对一个有一定规模的react前端项目执行jest单元测试时,遇到了如下问题:

node scripts/test.js –env=jsdom
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
2020-02-04 11:05 node9117 FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
events.js:174
throw er; // Unhandled ‘error’ event
^
Error: EMFILE: too many open files, watch
at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:123:28)
Emitted ‘error’ event at:
at FSEvent.FSWatcher._handle.onchange (internal/fs/watchers.js:129:12)
npm ERR! Test failed. See above for more details.

错误信息
Continue reading…

关于Vue.js项目build后部署到非站点根路径的问题

最近接触了下Vue.js框架,记录个build发布 production 版的部署位置问题:一般情况下,build出的dist直接放到Web服务器的根路径,如 http://www.xxx.com/ 访问就可以了,但如果想要放到子路径下,如 http://www.xxx.com/vue/ ,这时就会发现有资源加载报错了(通过vue-cli一般参数创建的项目, vue版本2.5.2)!

Continue reading…

CocosCreator TypeScript项目引用第三方库的方法和问题记录

TypeScript对于习惯强类型语言(比如Unity C#)而又要写JavaScript项目(比如CocosCreator Egret)的程序员来说,确实提供了很大方便,而且对于一些由于弱类型语言导致的只能运行时检查的低级错误,使用TS都能很好的避免。

这次要记录的是使用TypeScript作为主开发语言的CocosCreator项目中引用第三方库的方法和问题,实测的是MessagePackprotobufjs和Photon这几个库。

Continue reading…