小编Seb*_*oek的帖子

在Spring Boot应用程序中启动无限循环的这种方式是否有问题?

我有一个Spring Boot应用程序,它需要处理一些Kafka流数据。我向CommandLineRunner将在启动时运行的类添加了无限循环。那里有一个可以唤醒的卡夫卡消费者。我添加了一个关闭钩子Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup));。我会遇到任何问题吗?在春季,有没有更惯用的方法?我应该@Scheduled改用吗?下面的代码删除了特定的Kafka实现内容,但另有说明。

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.errors.WakeupException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.Properties;


    @Component
    public class InfiniteLoopStarter implements CommandLineRunner {

        private final Logger logger = LoggerFactory.getLogger(this.getClass());

        @Override
        public void run(String... args) {
            Consumer<AccountKey, Account> consumer = new KafkaConsumer<>(new Properties());
            Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup));

            try {
                while (true) {
                    ConsumerRecords<AccountKey, Account> records = consumer.poll(Duration.ofSeconds(10L));
                    //process records
                }
            } catch (WakeupException e) {
                logger.info("Consumer woken up for exiting."); …
Run Code Online (Sandbox Code Playgroud)

java spring apache-kafka spring-boot

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

NULLS FIRST/LAST 覆盖在 Spring Boot 3/Hibernate 6 的 JPA 存储库中不再起作用

在带有 Hibernate 5 的 Spring Boot 2 中,我们有一个如下查询:

@Query("""
    SELECT m FROM ProjectMember m
    ORDER BY m.lastActive ASC NULLS LAST
    """)
List<ProjectMember> sortLastActiveDesc();
Run Code Online (Sandbox Code Playgroud)

(在类中定义public interface ProjectMemberRepository extends JpaRepository<ProjectMember, UUID> {

该查询与真实查询相比略有删减,只是为了得到一个小的复制案例。

这是必需的,因为我们需要重写空值的排序方式。这里的底层数据库是PostgreSQL。

然而,在带有 Hibernate 6 的 Spring Boot 3.1.0 中,这不再起作用。应用程序将启动并且在启动时不会抛出异常,但是在执行此查询时它将抛出此异常:

org.springframework.dao.InvalidDataAccessApiUsageException
...
... (huge stack trace here)
...
Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: Line 2:26 mismatched input 'NULLS' expecting {<EOF>, ',', EXCEPT, FETCH, INTERSECT, LIMIT, OFFSET, UNION}; Bad JPQL grammar [select m from ProjectMember m
ORDER BY m.lastActive ASC NULLS …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa spring-boot

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

使用JPA和Hibernate时,PostgreSQL date_trunc('day',(entity.date AT TIME ZONE'UTC'))函数的JPQL等效项是什么?

JPQL / JPA / Hibernate等价于数据库功能是date_trunc('day', (entity.date AT TIME ZONE 'UTC'))什么?

我需要在Spring Boot应用程序中四舍五入到整天(和几周等),并使Hibernate运行在Postgresql数据库之上。这个查询可以在本地postgresql中进行,但是我还没有弄清楚如何在Hibernate中进行查询。时区(如“ UTC”,“欧洲/阿姆斯特丹”)和日期部分(如“日”,“年”)可能会有所不同,因此我不能仅将其设置为默认值。

我在Hibernate论坛上发现了一个古老的帖子,没有任何回复:https : //forum.hibernate.org/viewtopic.php? f =1& t =990451

我还发现了一个与StackOverflow相关的问题,发帖人直接希望在日期上选择某个时区。但是没有答复:HQL等同于Postgres的“时区的日期时间”

我的整个查询(没有where)看起来像这样,因此采用另一种方法也可以。

"SELECT NEW " + AggregateQueryEntity.class.getName() +
                "(date_trunc('" + aggregationPeriod.toString() +
                "', a.date), a.alertConfiguration.id.id, a.alertConfiguration.name, a.alertLevel, count(*)) from Alert a" +
                whereClause.toString() +
                " GROUP BY 1, a.alertConfiguration.id.id, a.alertConfiguration.name, a.alertLevel" +    //column 1 is the truncated date
                " ORDER BY 1, alertLevel DESC"
Run Code Online (Sandbox Code Playgroud)

编辑:对答案的评论。

弗拉德的答案很好,我对其进行了一些修改,以便将日期部分也作为变量。另外,我必须重写标准的Hibernate行为,该行为Date将按生成列,timestamp without timezonetimestamp with timezone通过将其放在我的列定义中来显式地创建它们: …

java spring hibernate jpa jpql

4
推荐指数
2
解决办法
1824
查看次数

我应该如何将未分页但已排序的 Pageable 传递给 Spring JPA 存储库?

Spring JPA 具有 Pageable 接口。我可以将其传递给存储库方法。它的一些实现如PageRequest包含 a page、 asize和 a sort。但是,还有一个unpaged我可以创建的实例,Pageable.unpaged()它返回一个org.springframework.data.domain.Unpaged实现 Pageable 的枚举。

当您想利用这个可分页对象的排序能力,但又不想分页时,问题就来了。在这种情况下,您应该希望Pageable.isPaged()返回 false,但是您通常可以创建的唯一实例是 PageRequest(带有Pagerequest.of(size, page, sort)),它始终为该方法返回 true。

如果您有这样的 JPA 存储库方法:

Page<EventTriggerVersion> findByProjectIdAndEventTriggerId(
    @Param("projectId") UUID projectId, @Param("eventTriggerId") UUID eventTriggerId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

然后你不能为它创建一个 Pageable ,它可以排序但不页面,即只返回 1 页的所有结果。

但是,您也可以不只是给它一个未分页的 Pageable 和一个 Sort 参数,如果你这样做,它会抛出这个异常: java.lang.IllegalStateException: Method must not have Pageable *and* Sort parameter. Use sorting capabilities on Pageable instead!

那么我应该如何在不复制我所有的存储库方法(主要有自定义查询)的情况下做到这一点,以获得带有 Pageable 和 Sort 的版本?

我们的用户只是想传递size=0他们的请求,然后获取所有数据(不限于某个任意的最大值,而是一个真正的未分页请求)。这很烦人,因为这意味着我需要从控制器中删除 …

java spring jpa spring-mvc spring-data

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

从Java中的mimepart获取图像的base64内容字符串

我试图在MimeMultiPart中获取MimePart的base64内容,但我正在努力使用Javamail包.我只想要某个内嵌图像的base64编码字符串,但似乎没有一种简单的方法可以做到这一点.我写了一个方法,将mime内容(作为字符串)和图像名称作为参数,并搜索包含该图像名称的base64内容的部分,并在最后返回此base64字符串(以及内容类型但与此问题无关)

以下是相关代码(包括相关导入):

import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import com.sun.mail.util.BASE64DecoderStream;



private static String[] getBase64Content(String imageName, String mimeString) throws MessagingException, IOException
 {
  System.out.println("image name: " + imageName + "\n\n");
  System.out.println("mime string: " + mimeString);

  String[] base64Content = new String[2];
  base64Content[0] = "";
  base64Content[1] = "image/jpeg"; //some default value

  DataSource source = new ByteArrayDataSource(new ByteArrayInputStream(mimeString.getBytes()), "multipart/mixed");  
  MimeMultipart mp = new MimeMultipart(source);

  for (int i = 0; i < mp.getCount(); i++)
  {
   MimePart …
Run Code Online (Sandbox Code Playgroud)

java base64 mime jakarta-mail

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