小编Cho*_*hop的帖子

Quartz:永远不会执行的Cron表达式

我知道有一个重复这里,这可能正是我的情况下,虽然它会值得一些更好的解释,我会尝试在这里提供.

我使用Spring应用程序上下文使用Java Web应用程序.在这种情况下,我使用Quartz定义了预定作业.这些作业由.properties文件中定义的cron触发.

Spring上下文嵌入在war中,而.properties文件位于应用程序服务器上(在这种特殊情况下为Tomcat).

这很好,允许根据环境(开发,集成,生产......)定义不同的crons.

现在,在我自己的计算机上本地运行此应用程序时,我不希望执行这些作业.有没有办法写一个永远不会触发的cron表达式?

spring quartz-scheduler

74
推荐指数
6
解决办法
8万
查看次数

更改Spring Boot项目以继承自定义依赖项管理

我有一个小的Spring Boot应用程序,我必须适应使用自定义父级.谷歌找到了很多关于如何迁移 Spring Boot 的例子,但我不知道 Spring Boot 迁移(我几乎不知道开始).

原因

简而言之,这个应用程序是作为一种概念验证而开发的,开发人员选择了最先进的技术.

现在,这个应用程序将继续生存,我们需要将它集成到我们的框架中.因此,作为一个Maven项目,它应该继承我们的一个普通父项,尽管我的理解是Spring Boot项目应该继承自Spring Boot的父级POM.

[编辑]我错了:可以在没有父POM的情况下使用Spring Boot.因此,删除Spring Boot不是义务,但我们的父POM包含自己的版本管理,这使我必须覆盖启动器中包含的几个版本.

为什么我们需要继承父母

我们在所有项目中都使用了一个企业框架.为了简化操作,我们在父POM中管理许多框架的版本.这些版本与我们的小批量项目中spring-boot-dependencies的版本冲突的一些示例:

  • Spring框架(内部:3.2.4; Spring Boot 1.2.2:4.1.5)
  • Spring Batch(ih:2.2.0; sb:3.0.3)
  • 速度(ih:1.5; sb:1.7)
  • Junit(ih:4.11; sb:4.12)
  • ...(我们管理大约90个版本)

我显然无权升级这些版本.请记住,这个框架用于许多项目,任何改变都可能产生严重和不受控制的后果.

附加背景

目标是获得一点Spring批处理应用程序.它必须从命令行获取一些输入,并12在执行失败时返回退出代码.下面是发射器的核心,但我愿意接受任何更好的方法.

我们的批处理启动器类

如果完全放弃Spring Boot,我需要调整这个启动器类,但是,主要用于XML Spring上下文,我发现这有点困难.

// ...
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("my.config.package")
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        // ...
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebEnvironment(false);
        final Map<String, …
Run Code Online (Sandbox Code Playgroud)

java spring maven spring-batch spring-boot

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

在MyBatis中使用基于resultType的隐式TypeHandler进行选择

我试图在MyBatis中选择一个时间戳并将其作为LocalDateTime(来自joda-time)返回.

如果我尝试将结果作为a返回,我的配置工作正常java.sql.Timestamp.我证明我的类型处理程序工作正常:如果我LocalDateTime在MyBatis映射器文件中使用包含as only字段和resultMap 的包装类,我会得到正确的结果.

但是,当我尝试为这个select 指定org.joda.time.LocalDateTimeas时resultType,我总是得到null,好像忽略了类型处理程序.

据我所知,在我拥有的情况下,MyBatis使用默认的typeHandler resultType="java.sql.Timestamp".因此,我希望它使用我在会议时配置的typeHandler之一resultType="org.joda.time.LocalDateTime".

我错过了什么?有没有办法使用我的typeHandler或者我被迫创建一个包装类和resultMap?这是我的后备解决方案,但我想尽可能避免它.

任何帮助赞赏.谢谢.

MyBatis的-config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeHandlers>
        <typeHandler javaType="org.joda.time.LocalDate" jdbcType="DATE" handler="...LocalDateTypeHandler"/>
        <typeHandler javaType="org.joda.time.LocalDateTime" jdbcType="TIMESTAMP" handler="...LocalDateTimeTypeHandler"/>
    </typeHandlers>
</configuration>
Run Code Online (Sandbox Code Playgroud)

NotifMailDao.java

import org.joda.time.LocalDateTime;

public interface NotifMailDao {

    LocalDateTime getLastNotifTime(String userId);
}
Run Code Online (Sandbox Code Playgroud)

NotifMailDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="lu.bgl.notif.mail.dao.NotifMailDao">

    <select id="getLastNotifTime" resultType="org.joda.time.LocalDateTime">
        SELECT current_timestamp
        AS last_time
        FROM DUAL
    </select> …
Run Code Online (Sandbox Code Playgroud)

java jodatime mybatis

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

Spring Batch如何管理事务(可能有多个数据源)?

我想了解有关Spring批处理中数据流的一些信息,但未能在Internet上找到我要查找的内容(尽管本网站上有一些有用的问题).

我正在尝试建立在我们公司使用Spring Batch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,Spring Batch的行为如何.

这个问题集中在一个分块的过程,但随时提供有关其他模式的信息.

从我所看到的(如果我错了请纠正我),当读取一行时,它会在读取下一行之前跟随整个流程(读取器,处理器,写入器)(而不是读取器处理的孤岛处理)所有行,将它们发送到处理器,等等).

在我的例子中,几个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后写入器将数据插入到另一个DB中.目前,JobRepository没有链接到数据库,但这将是一个独立的,使得事情仍然有点复杂.

由于数据属于多个业务领域,因此无法更改此模型.

在这种情况下如何管理交易?只有处理完整块后才提交数据吗?那么,是否存在两阶段提交管理?如何确保?应该进行哪些开发或配置以确保数据的一致性?

更一般地说,在类似情况下,您的建议是什么?

java transactions spring-batch

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

我怎么能不序列化继承的非瞬态字段?

这个问题

我有一个Serializable类(让我们称之为A),带有一个非瞬态布尔字段,以及一个子类(B),同一个字段应该是瞬态的.我怎样才能做到这一点?

更确切地说,我希望false在反序列化B时将字段恢复为默认的布尔值(),尽管我希望在反序列化时将其恢复为正确的值.但是,从A继承的其他字段仍应恢复.

在功能上,A表示在会话之间恢复的对象,B是特定类型的A,其状态应在每个新会话上重置.

快速代码示例:

public class A implements java.io.Serializable {

    private String label;
    // non-transient
    private boolean field;

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public boolean isField() {
        return field;
    }

    public void setField(boolean field) {
        this.field = field;
    }
}

public class B extends A {
    // field should be transient for this class
    // label should remain non-transient
}
Run Code Online (Sandbox Code Playgroud)

我选择不保留的一些可能的解决方案

  • 一个简单的解决方案是更改B extends A为 …

java serialization

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

如何让maven-assembly-plugin尊重pom.xml中定义的排除项?

TL; DR

在POM文件排除某些(特定)传递依赖项但将汇编描述符设置为获取所有依赖项时,排除的依赖项将包含在程序集中.我怎么能阻止这个?

一点背景

一些依赖项可能很难处理,因为它们的groupIds和artifactId几乎在每个版本(在我的例子中,bouncycastle)中都会发生变化.

我正在检索几个版本的bouncycastle(138,1.38,1.45和1.50).我的目的是消除1.50以外的所有版本.确切地说,我有一个依赖(让我们称之为some.perfectly.done:job)导入1.50和另一个(how.many.castles:do-you-need)导入所有其他依赖.它们是公司依赖项,因此为您提供真正的groupId:artifactId无法帮助您进行测试.

的pom.xml

我的依赖项声明如下:

<dependency>
    <groupId>some.perfectly.done</groupId>
    <artifactId>job</artifactId>
</dependency>
<dependency>
    <groupId>how.many.castles</groupId>
    <artifactId>do-you-need</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)

assembly.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>

    <!-- Adds dependencies to zip package under lib directory -->
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <useTransitiveFiltering>true</useTransitiveFiltering>
            <outputDirectory>lib</outputDirectory>
                        <outputFileNameMapping>${artifact.groupId}.${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>
    <!-- ... -->
</assembly>
Run Code Online (Sandbox Code Playgroud)

我得到了什么

$ ls *bouncycastle*
bouncycastle.bcmail-jdk14-138.jar       org.bouncycastle.bcmail-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15-1.45.jar
bouncycastle.bcprov-jdk14-138.jar …
Run Code Online (Sandbox Code Playgroud)

maven-3 maven maven-assembly-plugin

9
推荐指数
2
解决办法
2419
查看次数

使用Keycloak构建Java OAuth2.0授权服务器

TL; DR

  • 目标:Java授权服务器:
    • 具有细粒度权限的OAuth2.0授权代码授予流程(不仅仅是SSO服务器)
    • 用户管理和认证:自定义数据库
    • 客户端管理和身份验证:Keycloak
  • 问题:使用Keycloak支持的应用权限处理实现Java授权服务器的最佳实践是什么?
    • 我应该在开发中使用什么Keycloak适配器/ API?
    • 如果要显示用户,应该如何管理/出现在Keycloak?

预警

我是Keycloak的初学者,虽然我认为我理解主要原则,但它似乎是一个丰富的工具,我担心我可能仍然会误解使用它的最佳方法的某些方面.请不要犹豫,纠正我.

上下文

我们正在寻求实现一个API,要求我们的用户(以下称"用户")向第三方应用程序(以下称"客户端")授予权限.

我们的用户存储在基于数据库的自定义现有用户管理系统中.至于我们的客户,我们正在考虑使用Keycloak.

用户同意将使用OAuth2.0授权代码授权流程给出.他们将登录,指定他们授予的权限以及他们拒绝的权限,然后客户端将检索将用于访问API的访问令牌.

我的理解是,Keycloak可以处理授权令牌,但它不应该知道任何适用的,我们的权限.因此,我想到构建一个自定义授权服务器,它将使用Keycloak来解决所有身份/身份验证问题,但会自行处理应用程序权限.

然后,我们将使用Keycloak进行客户端身份验证和授权代码/访问令牌管理,应用程序部分将检查权限.

问题

除了我的第一次试验,我已经在互联网上漫游了一个星期,我很惊讶,因为我认为这将是一个非常标准的案例.然而我发现它几乎没有,所以也许我没有正确搜索.

我发现了许多关于如何制作"简单授权服务器"的Spring/Spring Boot教程1.这些主要是SSO服务器,很少有管理权限,除了这个SO答案2中提到的那些.我认为我们可以处理.

我遇到的真正问题是,我找到的教程都没有处理,如下:

如何在此授权服务器中集成Keycloak?

我一直在看可用的Java适配器.在进行身份验证时,它们看起来还不错,但我没有看到如何从自定义授权服务器(即管理域)管理客户端的提示.

因此,我想我应该使用admin API.我是正确的,这是好的做法吗?我没有看到适配器,所以我想我应该使用REST API.

我也想知道我们应该如何将我们的用户整合到设计中?它们应该在Keycloak中重复吗?在这种情况下,我们是否应该使用Keycloak的管理API来从授权服务器推送数据,还是有更好的方法?

最后,我错过了一些其他明显的观点吗?

对于长信息和许多问题感到抱歉,但最终归结为一个问题:

使用Keycloak作为主干构建授权服务器时的最佳做法是什么?


1.一些例子: Spring Boot OAuth2教程 - 博客文章 - 另一篇博文

2.我主要关注Spring Security OAuth提供的示例应用程序

java oauth-2.0 keycloak

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

使用 Spring Boot 2.1+ 为 Hibernate 配置缓存

背景和问题

我正在尝试在 Spring Boot 2.2 中使用 Hibernate 配置 EHCache,但似乎我做错了什么。我查看了几个教程和 SO 问题,但没有找到与我的方法完全匹配的内容。

我为缓存选择了无 XML、jcache 配置的方法。但是,Hibernate 没有检测到现有的缓存管理器(我检查甚至强制执行@AutoconfigureBefore:缓存管理器在 Hibernate 自动配置之前加载)。结果,Hibernate 创建了第二个EhcacheManager并抛出了几个警告,例如:

HHH90001006: Missing cache[com.example.demo.one.dto.MyModel] was created on-the-fly. The created cache will use a provider-specific default configuration: make sure you defined one. You can disable this warning by setting 'hibernate.javax.cache.missing_cache_strategy' to 'create'.
Run Code Online (Sandbox Code Playgroud)

我尝试使用 aHibernatePropertiesCustomizer来告诉 Hibernate 它应该使用哪个缓存管理器。bean 已实例化,但从未被调用,因此它失去了所有吸引力和用途。

有人知道我做错了什么以及我应该如何让 Hibernate 使用我已经配置的缓存管理器而不是创建自己的缓存管理器吗?

我将我的配置与JHipster生成的配置进行了比较。它看起来非常相似,尽管它们HibernatePropertiesCustomizer 称为。我没有成功确定他们的缓存配置和我的缓存配置之间的差异。

后期测试的笔记(编辑)

这似乎与我的数据源配置有关(请参阅下面的代码)。我尝试删除它并以更简单的方式启用我的 JPA 配置,并且HibernatePropertiesCustomizer确实按预期调用。

HHH90001006: Missing cache[com.example.demo.one.dto.MyModel] was …
Run Code Online (Sandbox Code Playgroud)

hibernate jcache spring-boot ehcache-3 spring-boot-2

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

至少强制要求一个小组

我对Java中的正则表达式有疑问,但我认为这也可能适用于其他语言.

我有一个正则表达式来解析用户可能输入类似内容的字段的时间4d 8h 42m.当然,我希望尽可能灵活,这样用户就不必被迫输入所有数字(15h例如输入一个数字).

关于这一点,我的正则表达式非常令人满意: (?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?

现在我的问题是它也将匹配一个空字符串,但我希望它确保至少填充一个时间单位.

目前的解决方案是任意选择其中一个是强制性的,但我不满意,因为强制性字段是我试图避免的.

另外,制作一个不适合我,因为我不得不在之后解析正则表达式时测试组,而不是仅仅访问组(1)几天,组(2)几个小时,...(这是我的想法当谈到a :(?:([\d]+)d[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*([\d]+)h[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*([\d]+)m),被理解为强制性的天数或强制性的小时或强制性的分钟).

那么我怎么能修改我的正则表达式以确保我现在非捕获组中的至少一个不是空的,无论是天,小时还是分钟?

java regex

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

用Jackson处理"N/A"值为空

我从外部JSON API获取数据并使用Jackson解析结果.不幸的是,该API返回所有字段,String"N/A"在数据不可用时填充这些字段.

我想用这些字段替换null,特别是当我尝试将JSON字符串字段转换为更具信息性的Java字段时,这些字段令人沮丧.

一个自定义DeserializationProblemHandler适用于Integer字段(见下文),但它对Java 8的LocalDate字段没用.此外,它会对问题做出反应而不是预测问题.

我无法找到配置到我的预处理器,ObjectMapper并且对于覆盖它的想法感到不安BeanDeserializer.

你知道更好/更清洁的解决方案来处理这种情况吗?谢谢!


DeserializationProblemHandler

new DeserializationProblemHandler() {
    @Override
    public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException {
        return "N/A".equals(valueToConvert) ? null : super.handleWeirdStringValue(ctxt, targetType, valueToConvert, failureMsg);
    }
}
Run Code Online (Sandbox Code Playgroud)

"N/A"LocalDate字段中处理时出现错误消息

Can not deserialize value of type java.time.LocalDate from String "N/A": Text 'N/A' could not be parsed at index 0
Run Code Online (Sandbox Code Playgroud)

(当数据中有日期时工作正常)

java json jackson

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