我知道有一个重复这里,这可能正是我的情况下,虽然它会值得一些更好的解释,我会尝试在这里提供.
我使用Spring应用程序上下文使用Java Web应用程序.在这种情况下,我使用Quartz定义了预定作业.这些作业由.properties文件中定义的cron触发.
Spring上下文嵌入在war中,而.properties文件位于应用程序服务器上(在这种特殊情况下为Tomcat).
这很好,允许根据环境(开发,集成,生产......)定义不同的crons.
现在,在我自己的计算机上本地运行此应用程序时,我不希望执行这些作业.有没有办法写一个永远不会触发的cron表达式?
我有一个小的Spring Boot应用程序,我必须适应使用自定义父级.谷歌找到了很多关于如何迁移到 Spring Boot 的例子,但我不知道从 Spring Boot 迁移(我几乎不知道开始).
简而言之,这个应用程序是作为一种概念验证而开发的,开发人员选择了最先进的技术.
现在,这个应用程序将继续生存,我们需要将它集成到我们的框架中.因此,作为一个Maven项目,它应该继承我们的一个普通父项,尽管我的理解是Spring Boot项目应该继承自Spring Boot的父级POM.
[编辑]我错了:可以在没有父POM的情况下使用Spring Boot.因此,删除Spring Boot不是义务,但我们的父POM包含自己的版本管理,这使我必须覆盖启动器中包含的几个版本.
我们在所有项目中都使用了一个企业框架.为了简化操作,我们在父POM中管理许多框架的版本.这些版本与我们的小批量项目中spring-boot-dependencies的版本冲突的一些示例:
我显然无权升级这些版本.请记住,这个框架用于许多项目,任何改变都可能产生严重和不受控制的后果.
目标是获得一点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) 我试图在MyBatis中选择一个时间戳并将其作为LocalDateTime(来自joda-time)返回.
如果我尝试将结果作为a返回,我的配置工作正常java.sql.Timestamp
.我证明我的类型处理程序工作正常:如果我LocalDateTime
在MyBatis映射器文件中使用包含as only字段和resultMap 的包装类,我会得到正确的结果.
但是,当我尝试为这个select 指定org.joda.time.LocalDateTime
as时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) 我想了解有关Spring批处理中数据流的一些信息,但未能在Internet上找到我要查找的内容(尽管本网站上有一些有用的问题).
我正在尝试建立在我们公司使用Spring Batch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,Spring Batch的行为如何.
这个问题集中在一个分块的过程,但随时提供有关其他模式的信息.
从我所看到的(如果我错了请纠正我),当读取一行时,它会在读取下一行之前跟随整个流程(读取器,处理器,写入器)(而不是读取器处理的孤岛处理)所有行,将它们发送到处理器,等等).
在我的例子中,几个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后写入器将数据插入到另一个DB中.目前,JobRepository没有链接到数据库,但这将是一个独立的,使得事情仍然有点复杂.
由于数据属于多个业务领域,因此无法更改此模型.
在这种情况下如何管理交易?只有处理完整块后才提交数据吗?那么,是否存在两阶段提交管理?如何确保?应该进行哪些开发或配置以确保数据的一致性?
更一般地说,在类似情况下,您的建议是什么?
我有一个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
为 …
当在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无法帮助您进行测试.
我的依赖项声明如下:
<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 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) 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中提到的那些.我认为我们可以处理.
我遇到的真正问题是,我找到的教程都没有处理,如下:
我一直在看可用的Java适配器.在进行身份验证时,它们看起来还不错,但我没有看到如何从自定义授权服务器(即管理域)管理客户端的提示.
因此,我想我应该使用admin API.我是正确的,这是好的做法吗?我没有看到适配器,所以我想我应该使用REST API.
我也想知道我们应该如何将我们的用户整合到设计中?它们应该在Keycloak中重复吗?在这种情况下,我们是否应该使用Keycloak的管理API来从授权服务器推送数据,还是有更好的方法?
最后,我错过了一些其他明显的观点吗?
对于长信息和许多问题感到抱歉,但最终归结为一个问题:
1.一些例子: Spring Boot OAuth2教程 - 博客文章 - 另一篇博文
我正在尝试在 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) 我对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)
,被理解为强制性的天数或强制性的小时或强制性的分钟).
那么我怎么能修改我的正则表达式以确保我现在非捕获组中的至少一个不是空的,无论是天,小时还是分钟?
我从外部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)
(当数据中有日期时工作正常)