小编Rai*_*baz的帖子

Facebook Graph API:尽管共享计数高于零,但无法获得共享帖子

我在图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不可行......或者我错过了什么?

facebook facebook-graph-api

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

Liquibase 生成空的 ALTER SEQUENCE 更改

我有一组 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)

postgresql liquibase liquibase-hibernate

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

考虑出现在许多枚举中出现的方法

我有几个带有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方法在不同的枚举中重复,因此我想将其分解在一个地方并避免重复的代码.

然而:

  • 枚举不能扩展抽象类
  • 具有默认方法的Java8接口无法访问该values()方法

我知道这可能是用AspectJ完成的,但是我宁愿不为这样简单的东西引入编译时编织,而Spring AOP(我手边有这个是Spring项目)只允许绑定现有的方法和不添加新的.

任何其他可行的解决方案,为枚举添加常用方法?

java enums spring java-8

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

对已弃用的JavaEE模块有选择地使用第三方实现

我目前正在将一个开源库移植到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上使用认可的实现,有没有办法可靠地测试使用第三方实现不会引入任何回归?

java java-ee maven java-9 java-11

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

Apache Camel RabbitMQ 将线程留在等待状态

我有一组 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,但问题仍然存在。

apache-camel rabbitmq kotlin

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

在 Camel 3 端点 DSL 中使用 RAW()

我最近迁移到 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() 的行为?

apache-camel camel-ftp

5
推荐指数
0
解决办法
144
查看次数

在不同的程序集中重新实现类方法

我有一个配置类,它从不同的源加载配置属性值,并允许以编程方式设置属性值。

目前,它尝试按以下顺序加载配置值:

  • 环境变量
  • 应用程序配置文件
  • 设置.json 文件
  • 使用默认值并允许用户在自己的代码中更改属性

由于大多数用户都以编程方式设置配置,并且我还想尽可能摆脱 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)

但我想知道是否有更好的方法来实现这一目标。

编辑澄清:我没有可用的依赖项容器,所以我不能使用依赖项注入,因为该类是库的一部分,我不想假设用户使用依赖项容器。

c# extension-methods

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

为什么将Type []强制转换为Class []会抛出ClassCastException?

今天我正在编写一些重要的反射使用代码,我遇到了这种行为我无法解释:为什么呢

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)

成功?

我的意思是,如果可以将单个元素转换为另一个类,为什么同样类型的数组之间的转换也不可能呢?

可能有一个原因,但我似乎无法找到一个......

java reflection casting

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

初始化Dart中的列表列表

我在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)

而且我似乎找不到一种用适当的rowcol值初始化每个单元格的方法:我尝试了两个嵌套的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 - 1row成员。

那么,Dart中惯用的初始化嵌套列表的方式是什么?

closures for-loop dart

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

在Angulardart中创建具有嵌套列表的表

我正在尝试构建一个代表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.

我错过了什么?

html dart angular-dart

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

将项目添加到地图中的列表的 Kotlin 惯用方法

我有一个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 中执行此操作的惯用方法是什么?

我并不是真正的目标是简洁,而是要立即识别和理解的形式。

collections idioms kotlin

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