小编JBA*_*JBA的帖子

将String作为变量连接到Character vs与其他String连接时有什么区别?

当我看到这样的东西(伪1线):

str1 + "a" + str2
Run Code Online (Sandbox Code Playgroud)

是否比以下(伪1线)更糟(或更好/相等)?

str1 + 'a' + str2
Run Code Online (Sandbox Code Playgroud)

更新:更好的例子(由@QPaysTaxes提供)以减少关于我原始示例的混淆.

我尝试了什么: 过去10年编程Java的各种东西,但我从来没有真正看到底层的东西 - 例如我会假设第二个稍微"更快/更好",因为没有为其创建的String-Object Java的斜杠标志和/或垃圾收集器必须处理更少.我曾经为Java证书做好准备,可能本来可以在那个时候更好地争论,但是我的日常业务似乎也是关于Java的"理论"必须保持最新...我知道没有任何比我indexOf('c')应该使用的假设更好的解释而不是indexOf("C")我想知道是否相同的字符串连接.

我也搜索了一下,但由于我的标题可能暗示我不太好描述我正在寻找的没有例子.对此我很抱歉,这个差点的可能性只是产生了重复.

我将尝试: 基于这里接受的答案字符串连接:concat()vs"+"运算符我希望能够有一个开始看到底层的什么,有一天能够争论/回答这样的问题,深入了解.

java string performance operator-keyword

22
推荐指数
3
解决办法
2135
查看次数

Java二进制文字 - 字节值-128

由于SE 7 Java允许将值指定为二进制文字.文档告诉我'byte'是一种可以保存8位信息的类型,值为-128到127.

现在我不知道为什么,但我不能定义8位但只有7如果我尝试将二进制文字分配给Java中的一个字节,如下所示:

byte b = 0b000_0000;    //solves to the value 0
byte b1 = 0b000_0001;   //solves to the value 1
byte b3 = 0b000_0010;   //solves to the value 2
byte b4 = 0b000_0011;   //solves to the value 3     
Run Code Online (Sandbox Code Playgroud)

依此类推,直到我们使用这7位获得最后几种可能性:

byte b5 = 0b011_1111;   //solves to the value 63
byte b6 = 0b111_1111;   //solves to the value 127
Run Code Online (Sandbox Code Playgroud)

如果我想让它成为负数我必须添加一个领先 - 在这样的前面:

byte b7 = -0b111_1111;   //solves to the value -127
Run Code Online (Sandbox Code Playgroud)

现在问题的一半是我只使用7位来描述他们告诉我的是8位数据类型.下半部分是他们似乎没有线程作为二进制补码,除非使用32位int类型,我可以定义所有32位(包括"符号指示位").

现在,当我搜索如何显示范围内的数字-128时,我被告知这样做,没有任何进一步的解释:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;
Run Code Online (Sandbox Code Playgroud)

我可以清楚地看到最后8位(1000 0000)在使用8位的两个强制中确实代表-128,但我从来没有被混淆过多并尝试提出我的问题:

  • 上面32位长是不是一个32位(java-)int值? …

java binary byte literals twos-complement

8
推荐指数
1
解决办法
9456
查看次数

设置要使用的JAXB上下文工厂初始化类

我已经更新了我们的项目(基于Java EE在Websphere 8.5上运行)以使用公司内部框架的新版本(以及Ejb 3.x部署描述符而不是2.x部署描述符).从那时起,我的集成测试失败,出现以下异常:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]
Run Code Online (Sandbox Code Playgroud)

我可以使用之前的框架版本构建应用程序,一切正常.调试时我注意到在ContextFinder(javax.xml.bind)中有两种不同的行为:

  1. 以前的版本(一切正常):不同的地方都没有出现工厂类,因此加载了默认的工厂类,即com.sun.xml.internal.bind.v2.ContextFactory(在类中定义为String常量) .

  2. 升级版本(ClassNotFound):成功加载资源"META-INF/services/javax.xml.bind.JAXBContext",第一行读取使ContextFinder尝试加载"com.ibm.xml.xlxp2.jaxb". JAXBContextFactory"导致错误.

我现在有两个问题:

  1. 那资源是什么类型的?因为在我们的EAR中有两个WAR,并且这两个WAR中没有一个在其META-INF目录中包含文件夹服务.

  2. 那个价值在哪里呢?因为一个提交者向我显示没有新的或更改的属性文件.

无需说我将阅读有关JAXB配置可能性的所有内容,但如果您对可能出现的问题有所了解或帮助我使用该资源(这是一个真正的文件,我必须寻找?)id欣赏一个许多.非常感谢!

编辑(根据评论输入/问题):

出于好奇,您的框架是否包含JAXB JAR?您的框架的旧版本是否包含jaxb.properties?

确实(我有点惊讶)框架在EAR中有一个定制的eclipselink-2.4.1-.jar,它包括一个JAXB实现和一个jaxb.properties文件,它在两个版本中显示以下条目(找到的工厂以及抛出异常的工厂):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

我认为这与当前的问题无关,因为jar在两个EAR中都保持完全相同(运行的那个/带有期望的那个)

我也不清楚为什么旧版本的框架选择了com.sun实现

有一个类javax.xml.bind.ContextFinder,它负责初始化JAXBContextFactory.此类搜索各种placess以查找jaxb.properties文件或"javax.xml.bind.JAXBContext"资源的存在.如果所有这些地方都没有显示要使用哪个Context Factory,那么会加载一个在类本身中硬编码的deault工厂:

private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
Run Code Online (Sandbox Code Playgroud)

现在回到我的问题:

使用先前版本的框架(以及EJB 2.x部署描述符)构建一切正常.在调试时,我可以看到没有找到配置,因此上面提到的默认工厂已加载.

使用新版本的框架(以及我可以部署的EJB 3.x部署描述符)构建仅TESTCASE失败但其余功能正常工作(就像我可以向我们的Web服务发送请求并且它们不会触发任何错误).调试时我可以看到找到了配置.该资源名为"META-INF/services/javax.xml.bind.JAXBContext".以下是此资源如何导致尝试加载"com.ibm.xml.xlxp2.jaxb.JAXBContextFactory"然后抛出ClassNotFoundException的最重要的一行.这是上述javax.xml.bind.ContextFinder类的简化源代码:

URL resourceURL = ClassLoader.getSystemResource("META-INF/services/javax.xml.bind.JAXBContext");

BufferedReader r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));

String factoryClassName = r.readLine().trim();  
Run Code Online (Sandbox Code Playgroud)

字段factoryClassName现在具有值'com.ibm.xml.xlxp2.jaxb.JAXBContextFactory'

因为这已经成为一个超级大问题,我还会加上一个赏金:)我将在这整天工作,让你知道是否有任何消息.

更新/解决方案

这个问题已经解决了.原始问题已经发生,因为错误配置了复杂构建的多模型maven项目,其中一个依赖项使用了自定义eclipse链接jar的更新版本,其中包含发生错误的组件中不可用的JAXBFactory的定义.在大多数情况下,设置JAXB上下文工厂是使用包含相同定义的jaxb.propertie文件或JAXBContext文件配置的.适当的JAXBContextFactory的详细加载过程发生在javax.xml.bind.ContextFinder中.

错误尚未解决(事实上超过4个主要EE/SE应用程序导致错误)并且没有一般答案但是定义的JAXBContextFactorys必须存在于您的类路径中(哇多么奇怪......)所以你要么有一个ClassNotFound错误,因为你缺少资源(这就是实际原因),或者因为你在上面提到的任何属性文件中定义了一个错误的JAXBContextFactory,其中包含根据以下答案的定义.

非常感谢您的好评和支持,我真的很感激!

java websphere jaxb

7
推荐指数
1
解决办法
4万
查看次数

Liquibase + H2 + Junit 主键序列重新开始

我设法将 Liquibase 集成到我们的 Maven 构建中,以使用一些 enrys 初始化 H2 内存数据库。这些行具有使用按预期工作的序列表生成的主键(BigInt 递增值从 1 开始)。

我的问题是,当我尝试从 Junit 集成测试中将新实体持久化到该表中时,我得到“唯一键约束冲突”,因为该新实体与使用 Liquibase 更改日志插入的第一行具有相同的主键 - xmls。

因此,初始化按预期工作得非常好。maven 构建使用 liquibase changelog-xmls

现在,我只是在使用自己的 Runner 进行任何集成测试之前完全擦除相应的表……但这在未来是不可能的。由于目前还没有太多关于 Liquibase 的具体信息,因此目前调查此类问题是一项艰巨的任务。

更新解决方法

虽然 id 更喜欢下面使用 H2 的答案会带来以下问题,因为不支持所需的 minValue,因此下面的变更集不起作用。

<changeSet author="liquibase-docs" id="alterSequence-example">
  <alterSequence 
        incrementBy="1"
        maxValue="371717"
        minValue="40"
        ordered="true"
        schemaName="public"
        sequenceName="seq_id"/>
Run Code Online (Sandbox Code Playgroud)

作为一个简单的解决方法,我现在只需删除用于在第二个更改集中插入我的测试数据的现有序列:

 <changeSet id="2" author="Me">

    <dropSequence
        sequenceName="SEQ_KEY_MY_TBL"/>

    <createSequence 
        sequenceName="SEQ_KEY_MY_TBL" 
        incrementBy="1" 
        startValue="40"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

这样,changelog-*.xml 中配置的值将使用初始值为 1 的序列插入。我插入 30 行,因此使用键 1-30。之后,序列被删除并使用更高的 startValue 重新创建。这样,当从基于 Junit 的集成测试中持久化实体时,新实体的主键将从 40 开始,并且解决了以前的唯一约束问题。

不是 H2 可能很快会发布支持 minValue/maxValue 的版本,因为相应的补丁已经存在。

更新:

也许我们应该提到这仍然只是一种解决方法,有人知道 H2 是否支持带有 Liquibase 的序列,并且在 …

java junit spring liquibase maven

5
推荐指数
1
解决办法
2006
查看次数

Liquibase改变了列约束

我想从一个特定的示例开始,其中创建一个表,其中一个列具有一个约束,指示此列是外键:

<changeSet id="1" author="A1">
    <createTable tableName="TABLE_A">
        <!-- Other columns -->
        <column name="FK_TABLE_B" type="BIGINT">
            <!-- the 'TABLE_B' will be renamed soon ! -->
            <constraints references="TABLE_B(ID_PK)"
                foreignKeyName="JUST_UNIQUE_I_GUESS" nullable="false" />
        </column>
    </createTable>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

现在第一个问题:假设TABLE_B将被重命名为TABLE_NEW ...我将如何更改上述约束,以便指向重命名的Tables列ID_PK?

我看到了一些可能性:

  • 修改changeSet本身(H2 inMemory DB没有问题......但是cmon ......那不是idear吧?)
  • 将整个列放在我自己的changeSet中,并使用新的约束再次添加它,因为列名称可能会更改为FK_TABLE_NEW,但这对于生产环境来说不是真正的可能性
  • 以某种方式改变了这个约束 - >但是如何!?文档根本没有帮助......

接下来的问题是,如果存在这种限制,为什么要采用这种约束方式

<addForeignKeyConstraint ...>
Run Code Online (Sandbox Code Playgroud)

还有?

因此,目前我根本不感觉Liquibase,因为这是我第一次尝试更改现有的changeSet,我最大的问题是:这是一个不理解最佳实践或实际上是"不那么verbouse"文档问题的问题吗?

谢谢你的帮助!

我尝试了什么

假设上面的约束定义以某种方式导致与a完成时相同

<addForeignKeyConstraint ...>
Run Code Online (Sandbox Code Playgroud)

标签,但属性较少.所以我想我可以使用

<dropForeignKeyConstraint ...>
Run Code Online (Sandbox Code Playgroud)

tag首先删除ForeignKeyConstraint,然后添加一个新的.但它仍然告诉我,当尝试在H2内存数据库中执行第一个changeSet时,它不会找到表TABLE_B.

我的变更集看起来像这样:

<changeSet id="1" author="A2">
    <dropForeignKeyConstraint baseTableName="TABLE_A"
        constraintName="JUST_UNIQUE_I_GUESS" />

    <addForeignKeyConstraint
        constraintName="JUST_UNIQUE_I_GUESS"
        referencedTableName="TABLE_NEW" baseColumnNames="FK_TABLE_B"
        baseTableName="TABLE_A" referencedColumnNames="ID_PK" />
</changeSet>
Run Code Online (Sandbox Code Playgroud)

背景资料

由于目前只使用内存数据库(H2)构建POC,因此只需更改第一个changeSet直到我们拥有相当的最终方案状态......但是如果你已经如何处理这些事情那么有一个现有的数据库,数以百万计的东西?目前我非常怀疑Liquibase是一家拥有1k +开发人员而不雇用Liquibase专家的公司的正确决定......

xml sql constraints liquibase

3
推荐指数
1
解决办法
1万
查看次数

Enterprise Architect将类元素设置为不推荐使用

我刚刚开始使用EA,并想知道如何表明一个类被弃用了?尝试将类标记为折旧并在现有图表上以不同颜色显示.

或者一般说我目前正在基于现有系统开发POC,并希望对类进行分类,例如"POC上下文","折旧","未定义"等等.是否需要"标记值" ?(因为目前我只是在所有图表中给它们不同的颜色......)

我做了什么

目前我正在观看教程视频并使用2888页手册,并且能够在EA中获得一个艰难但良好的开端但是从2小时开始无法解决这个问题.

uml enterprise-architect

2
推荐指数
1
解决办法
363
查看次数

没有namespace-attribute的模式导入

HY,

如果我导入这样的命名空间:

<xs:import namespace="UniqueIRIstyleNameSpaceName" schemaLocation="mySchema.xsd"></xs:import>
Run Code Online (Sandbox Code Playgroud)

我知道mySchema.xsd创建了一个targetNamespace ="UniqueIRIstyleNameSpaceName".现在,如果我去:http://www.w3schools.com/schema/el_import.asp并读取绑定到'xs'的命名空间中定义的'import'元素的相应API,它表示属性'namespace'是可选的.

现在这里是问题:

  • 必须这样导入的属性'namespace'的值始终与相应模式(.xsd)中'targetNamespace'的值相同?

  • 如果是这样的话:根本不完全放弃"命名空间"属性会更容易吗?

  • 如果不是:...我陷入了深深的麻烦,因为我似乎没有完全理解命名空间概念,并且真的会对几个关键字感兴趣,在那里查找信息以关闭泄漏:)

我问这个是因为我目前正在使用XML/XSD,这是我职业生涯的第5次,并且从未在另一个版本中看到它,但是'namespace'属性总是在那里并且在相应的模式中匹配'targetNamespace'的值.

非常感谢提前和问候

JBA

xml import schema xsd namespaces

1
推荐指数
1
解决办法
6498
查看次数