首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java库中覆盖属性

在java库中覆盖属性
EN

Stack Overflow用户
提问于 2021-11-11 13:06:45
回答 2查看 172关注 0票数 1

我有一个Lib-A,它依赖于com.atlassian.oai:swagger-request-validator-core.此依赖项有一个属性文件messages.properties

我有一个应用程序-A,它依赖于Lib。如果我把messages.properties文件放在App中,我可以覆盖属性,但是如果我将它放在Lib中,它就不会覆盖。我如何覆盖Lib-A的属性?

似乎也没有办法改变路径:https://bitbucket.org/atlassian/swagger-request-validator/src/master/swagger-request-validator-core/src/main/java/com/atlassian/oai/validator/report/MessageResolver.java#lines-26

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-11 16:50:03

简单的农民:

  1. demo/pom.xml 4.0.0 com.example演示0.0.1-快照org.slf4j slf4j-简单1.7.32 com.atlassian.oai swagger-请求-验证器-核心2.22.0
  2. demo/src/main/resources/swagger/validation/messages.properties (区分大小写): validation.request.path.missing=FOO '%s'.#来自.#.swagger的现有密钥--带有自定义消息的验证器(并遵守参数)
  3. demo/src/main/java/com/example/demo/Main.java: 包com.atlassian.oai.validator.report.MessageResolver;com.example.demo;导入com.atlassian.oai.validator.report.ValidationReport.Message;导入org.slf4j.Logger;导入静态org.slf4j.LoggerFactory.getLogger;公共类Main {私有静态最终日志= getLogger(Main.class);公共静态Main.class(String[] args) { MessageResolver mr =新MessageResolver();消息m= mr.get("validation.request.path.missing","bar");log.info("got消息:{}",m == null?)null :m.getMessage();}
  4. (仅使用这3个文件,请在终端(或IDE中)执行):cd演示>mvn清洁过程-类执行:java -Dexec.mainClass="com.example.demo.Main“
  5. 输出: 信息..。信息-- exec-maven-plugin:3.0.0:java (默认-cli)@spring-data- com.example.demo.Main -获得消息: FOO 'bar‘。信息信息建立成功信息

如果删除/重命名/移动messages.properties,就会得到(原始的) No API path found that matches request 'bar'

也就是说,只需将文件放置在正确的位置(classpath:/swagger/validation/messages.properties),就可以更改(默认) MessageResolver的消息。

Edit1:

我认为这将“始终有效”,因为bin/目标文件夹中的文件将优先于“jars中的资源”,但它取决于类路径/-加载程序/执行细节。但是在这种情况下,在“您的jvm”中创建的任何(默认的) MessageResolver都会更喜欢这个/ messages.properties

如果这样做,请确保所有键在 messages.properties (+ match count(&semantics))中可用,因为在尝试以下操作时:

代码语言:javascript
运行
复制
// message key not present in (our!) swagger/validation/messages.properties
log.info("got other message: {}", 
  mr.get("validation.request.operation.notAllowed", "foo", "bar")
);

,我们得到;(:

代码语言:javascript
运行
复制
[com.example.demo.Main.main()] INFO com.example.demo.Main - got other message: null

Edit2:

与(实际上)覆盖/替换(默认)“资源包”不同,您还可以通过添加语言、国家、平台特定消息(但仍然返回到默认消息)来获得所有的“继承和回退魔法”。

示例性文件夹结构:

代码语言:javascript
运行
复制
demo
--src
----main
------resources
--------swagger
----------validation
------------messages_en_GB.properties
------------messages_en_US.properties
------------messages_en.properties
------------messages_de.properties
------------...

另请参阅:

Edit3:

我得到了它(替换为“had”)也在处理一个临时依赖关系,但我必须确保:

  • 或者demo是唯一的(直接)依赖项。
  • 或者(在pom中)出现在 swagger-request-validator-core之前。

这听起来不太可靠,但这正是我所发现/测试的。

和"beyond maven“(对不起使用了它),我们可以说:带有自定义消息的依赖项应该出现在swagger-request-validator-core.jar之前的类路径中

票数 0
EN

Stack Overflow用户

发布于 2021-11-11 14:09:57

你能试试这个吗?(未测试) ->

代码语言:javascript
运行
复制
public class CustomMessageResolver extends MessageResolver{
    private final ResourceBundle customMessages = ResourceBundle.getBundle("MYPATH/custom_messages");

    public ValidationReport.Message get(@Nonnull final String key, final Object... args) {
        requireNonNull(key, "A message key is required.");
        final ValidationReport.Level level = levelResolver.getLevel(key);
        if (!customMessages.containsKey(key)) {
            log.warn("No message key found for '{}'", key);
            return null;
        }
        return new ImmutableMessage(key, level, format(customMessages.getString(key), args));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69928806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档