我在图API中遇到了一个奇怪的行为:我想列出共享帖子的份额,所以我要求/<post_id>/sharedposts?fields=shares获得共享帖子后续共享的次数.
因此,我得到的响应是这样的对象列表:
{
"shares": {
"count": 1
},
"id": "136178893505927_155012298289253"
},
Run Code Online (Sandbox Code Playgroud)
但是,如果我要求/136178893505927_155012298289253/sharedposts,我会
{
"data": [
]
}
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我期待一个对象出现在响应中.
此外,如果我要求/<post_id>/sharedposts?fields=shares,sharedposts我得到一个包含shares.count高于0 的奇怪列表,并且sharedposts在某些情况下没有内容,并且sharedposts数组包含的元素少于shares.count其他一些元素.
我猜这是因为共享帖子对我的个人资料不可见,但我不应该看到它们,因为原始帖子是在我管理的页面上发布的吗?
我正在尝试构建共享图表,以确定重新共享的共享对整体共享计数的贡献是否超过其他共享,但看起来这对图API不可行......或者我错过了什么?
我有一组 JPA 实体,它们的 ID 由序列生成:
@GenericGenerator(
name = "catalog_items_history_seq",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = [
(Parameter(name = "sequence_name", value = "catalog_item_history_sequence")),
(Parameter(name = "initial_value", value = "1")),
(Parameter(name = "increment_size", value = "1"))
]
)
class CatalogItemHistory {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "catalog_items_history_seq")
var id: Long = -1
}
Run Code Online (Sandbox Code Playgroud)
当我diffChangeLog第一次运行gradle 任务时,我得到了正确的 CREATE SEQUENCE 语句并且序列创建正常。
但是,如果我再次运行该任务,我的更改日志将包含如下更改:
<changeSet author="raibaz (generated)" id="1582110272824-1">
<alterSequence sequenceName="catalog_item_history_sequence"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
这会导致语法错误,因为它们生成的 SQLALTER SEQUENCE catalog_item_history_sequence是无效的,因为它实际上并没有改变任何东西。
当我运行 liquibase 来更新我的数据库架构时,我得到的是:
Caused by: liquibase.exception.DatabaseException: ERROR: syntax …Run Code Online (Sandbox Code Playgroud) 我有几个带有name属性的枚举和一个byName大致类似于所有这些的方法:
public static Condition byName(String name) throws NotFoundException {
for (Condition c : values()) {
if (c.name.equals(name)) {
return c;
}
}
throw new NotFoundException("Condition with name [" + name + "] not found");
}
Run Code Online (Sandbox Code Playgroud)
由于该byName方法在不同的枚举中重复,因此我想将其分解在一个地方并避免重复的代码.
然而:
values()方法我知道这可能是用AspectJ完成的,但是我宁愿不为这样简单的东西引入编译时编织,而Spring AOP(我手边有这个是Spring项目)只允许绑定现有的方法和不添加新的.
任何其他可行的解决方案,为枚举添加常用方法?
我目前正在将一个开源库移植到JDK9 +兼容,它依赖于Java 9中已弃用并在Java 11中删除的一些Java EE模块:特别是JAXB,JAX-WS和javax.annotation.
我添加显式依赖于第三方实施的建议在这里:
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-ri</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是,我希望我的库只在必要时使用它们(即在JDK9 +上)并继续使用JDK8上的认可实现.
我可以通过在Maven配置文件中添加仅在JDK 9及更高版本上激活的依赖项来实现,但是如果我想在Maven Central上为我的库发布jar文件呢?我是否应该发布两个不同的jar,一个包含Java EE第三方实现,用于JDK9 +,另一个没有用于JDK8?
有没有办法生成一个jar文件,它将使用JDK9 +上的第三方实现和JDK8上的背书实现?
我已经研究过多版本jar,但看起来它们是用于项目类之间的jdk版本相关实现,而不是依赖项.
此外,如果无法在JDK 8上使用认可的实现,有没有办法可靠地测试使用第三方实现不会引入任何回归?
我有一组 Camel 路由配置为读取和写入 RabbitMQ 队列,或多或少是这样的:
from("rabbitmq:$rabbitMQVhost?connectionFactory=#customConnectionFactory&queue=${it.rabbitMQQueue}&routingKey=${it.rabbitMQQueue}&SOME_MORE_PROPERTIES")
.log("Read message from queue ${it.rabbitMQQueue}")
.routeId(it.rabbitMQQueue)
.noAutoStartup()
.bean(it.rabbitMQBean)
.choice()
.`when`(PredicateBuilder.and(simple("$myCondition"), isNotNull(body())))
.split(body())
.toD("rabbitmq:$rabbitMQVhost?connectionFactory=#customConnectionFactory&queue=${it.rabbitMQQueueDestination}&autoDelete=false&routingKey=${it.rabbitMQQueueDestination}&bridgeEndpoint=true")
.endChoice()
.otherwise()
end()
Run Code Online (Sandbox Code Playgroud)
SOME_MORE_PROPERTIES基本上在哪里autoDelete=false&autoAck=false和一些消息预取设置。
我的 ConnectionFactory 是一个org.springframework.amqp.rabbit.connection.CachingConnectionFactory.
每当消息进入我的源队列时,就会启动一个线程来处理它;然而,处理完成后,它挂在等待状态,永远不会被释放或终止,所以我的应用程序内存在一段时间后饱和,垃圾收集器对此无能为力。
运行一段时间后,我的应用程序基本处于这种状态:
如果我手动重新启动路由,线程将终止并释放内存。
我的路由配置是否有什么错误导致线程无法正确终止?
我想避免每隔一段时间编写一个石英作业来重新启动路由。
编辑:我最近也从 Camel 2.24.0 更新到 Camel 3 的最新 RC,但问题仍然存在。
我最近迁移到 Camel 3 的 Camel 应用程序中有一组 FTP 端点,但我在密码编码方面遇到了困难。
我有一些包含特殊字符的密码,例如+,过去我可以通过将端点指定为ftp://user@host/path?password=RAW(password).
但是,我现在想使用新的 Endpoint DSL 声明这些路由,如下所示:
ftp(host:port/path).username(user).password(password)
Run Code Online (Sandbox Code Playgroud)
这样我的密码中的特殊字符是 URL 编码的,因此无法登录。
有没有办法在新的端点 DSL 中复制使用 RAW() 的行为?
我有一个配置类,它从不同的源加载配置属性值,并允许以编程方式设置属性值。
目前,它尝试按以下顺序加载配置值:
由于大多数用户都以编程方式设置配置,并且我还想尽可能摆脱 Microsoft.Extensions.Configuration 依赖项,因此我想将前三种情况移动到不同的程序集中,以便在用户想要时明确依赖例如,从 App.config 文件加载配置属性。
理想情况下,我希望更改对用户来说是透明的,这样他们就不必更改现有的代码。
我的配置类目前在其构造函数中所做的事情是:
public Config()
{
InitializeDefaults();
ReadEnvironmentVariables();
ReadAppConfig();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在我现有的程序集中提供ReadEnvironmentVariables和的空实现ReadAppConfig,并将其替换为新程序集中的实际实现,这样,如果应用程序的依赖项中有新程序集,则它使用实际的实现,否则默认为空方法?
我可以通过在新程序集中#defining一个常量并执行以下操作来做到这一点
#if CONFIG_EXTENSION
ReadEnvironmentVariables();
ReadAppConfig();
#endif
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法来实现这一目标。
编辑澄清:我没有可用的依赖项容器,所以我不能使用依赖项注入,因为该类是库的一部分,我不想假设用户使用依赖项容器。
今天我正在编写一些重要的反射使用代码,我遇到了这种行为我无法解释:为什么呢
Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments();
Class[] c = (Class[])types;
Run Code Online (Sandbox Code Playgroud)
当迭代同一个数组并转换每个元素时,抛出一个ClassCastException,即
for(Type t : types) {
Class c = (Class)t;
}
Run Code Online (Sandbox Code Playgroud)
成功?
我的意思是,如果可以将单个元素转换为另一个类,为什么同样类型的数组之间的转换也不可能呢?
可能有一个原因,但我似乎无法找到一个......
我在Dart中有一个网格,实现如下:
class Cell {
int row;
int col;
Cell(this.row, this.col);
}
class Grid {
List<List<Cell>> rows = new List(GRID_SIZE);
Grid() {
rows.fillRange(0, rows.length, new List(GRID_SIZE));
}
}
Run Code Online (Sandbox Code Playgroud)
而且我似乎找不到一种用适当的row和col值初始化每个单元格的方法:我尝试了两个嵌套的for循环,就像这样
for(int i = 0; i < GRID_SIZE; i++) {
for(int j = 0; j < GRID_SIZE; j++) {
rows[i][j] = new Cell(i, j);
}
}
Run Code Online (Sandbox Code Playgroud)
但由于飞镖的闭合差保护描述在这里,我的网格结束了其细胞被填充GRID_SIZE - 1的row成员。
那么,Dart中惯用的初始化嵌套列表的方式是什么?
我正在尝试构建一个代表List<List<int>>Angulardart中的表的表.
这是我的模板文件的内容:
<table>
<tbody>
<tr *ngFor="#row of cells">
<td *ngFor="#cell of row">
<input type="number" #cell (keyup)="0"/>
</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
列表初始化如下:
class Grid {
const GRID_SIZE = 9;
List<List<int>> cells = new List(GRID_SIZE);
Grid() {
cells.forEach((x) => x = new List(GRID_SIZE));
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在渲染的HTML中我只看到9个<tr>空标签,<td>里面没有s.
我错过了什么?
我有一个MutableMap<String, MutableList<String>我正在向其中添加项目,基本上是一个集合,其中相同的键与多个值相关联。
每当我想添加一个新值时,我需要首先检查是否已经有一个与同一个键关联的列表,如果没有则初始化一个,然后将该值添加到列表中。
我可以通过这样做以非常冗长的方式做到这一点
if (map.containsKey(key)) {
map[key].add(value)
} else {
map[key] = mutableListOf(value)
}
Run Code Online (Sandbox Code Playgroud)
我也可以通过这样做以非常简洁的方式做到这一点
map[key] = (map[key] ?: mutableListOf()) + mutableListOf(value)).toMutableList()
Run Code Online (Sandbox Code Playgroud)
以及介于冗长与简洁之间的其他几种方式。
但是,在 Kotlin 中执行此操作的惯用方法是什么?
我并不是真正的目标是简洁,而是要立即识别和理解的形式。
java ×3
apache-camel ×2
dart ×2
kotlin ×2
angular-dart ×1
c# ×1
camel-ftp ×1
casting ×1
closures ×1
collections ×1
enums ×1
facebook ×1
for-loop ×1
html ×1
idioms ×1
java-11 ×1
java-8 ×1
java-9 ×1
java-ee ×1
liquibase ×1
maven ×1
postgresql ×1
rabbitmq ×1
reflection ×1
spring ×1