有了使用Spring DI applicationContext.xml声明依赖注入的方法的经验,我现在试着弄清楚如何用Java EE6 CDI做同样的事情.
使用Spring,我可以将我的.jar与几个配置文件一起发送,例如 unittest.xml,devel.xml,qa.xml,production.xml,并使用命令行参数或环境变量激活它们.
使用CDI,我可以在beans.xml中使用@Alternative 和web.xml中的属性,但似乎无法为不同的环境发送多个beans.xml.
我不想使用Maven配置文件/过滤器来生成我的应用程序的4-6版本,虽然我知道在某些情况下这将是更好的解决方案(即向客户发送准备好的构建战争 - 但我只在内部使用我的战争所以让我们节省编译时间!)
最好,我还可以从文件系统加载这些配置文件,以便系统管理员可以编辑它们,而无需重新构建应用程序.
具有多个依赖关系和属性配置集的Java EE6方法是什么?
如果没有,那么2013年的推荐替代品是什么?使用Spring?接缝?吉斯?我看到了Apache DeltaSpike的提及,但它们仍然看起来像网页上的alpha.
我想使用像一个URL http://www.example.com/rest/foo?bar,其中bar查询参数没有价值,它的单独存在应表示变量是否true或false.
目前,缺失值假定为""(空)并传递给new Boolean()它,将其视为false.
是否有更优雅的方式来定义它而不是将参数声明为String并自行转换它?
像一个类javax.rs.BooleanFlag或类似的?
Debian 有一个很好的机制来将所有常用的来自 Thawte、Let's Encrypt 等的 CA 证书以及本地安装的证书编译/usr/local/share/ssl成一个/etc/ssl/certs/java/cacertsJKS 文件。这通常被符号链接到$JAVA_HOME/lib/security/cacerts.
使用 sdkman,我在不同的非 Debian Java 版本之间切换,~/.sdkman/candidates/java/current/其中使用SDK 创建者提供的cacerts。
是否有某种 post-inst 挂钩机制,我可以在切换 sdkman Java 版本时自动创建指向 Debian cacerts文件的符号链接?
我有一个应用程序通过 oauth2-proxy 连接到 Keycloak,通常一切运行正常。
有时我会在 oauth2-proxy 日志文件中看到以下错误:
unable to redeem refresh token: failed to get token: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Session doesn't have required client"},
removing session.
Run Code Online (Sandbox Code Playgroud)
Keycloak日志文件中相应的消息是这样的:
org.keycloak.events
type=REFRESH_TOKEN_ERROR, realmId=xxx, clientId=xxx, userId=f:ce9d954a-de51-48a4-a70b-xxx:xxx, ipAddress=x.x.x.x, error=invalid_token, grant_type=refresh_token, refresh_token_type=Refresh, refresh_token_id=bb77d7aa-c061-45d4-b2f7-fe938d5537cb, client_auth_method=client-secret
Run Code Online (Sandbox Code Playgroud)
我在例如“会话没有所需的客户端”意味着什么?中发现了相同的错误消息。但这个问题是针对 Keycloak 4.x 的,而我使用的是最新的 16.1.1。此外,我不使用“记住我”会话。
源代码仅在 oidc/TokenManager.java 中包含此消息,其中建议存在“跨 DC 环境”问题,但我们没有跨数据中心环境,只有同一 Kubernetes 命名空间中的三个实例安装了最新的 Helm 图表。
还有什么可能导致这个问题?
我对Wildfly Swarm项目感兴趣,以创建fat-jar JavaEE应用程序,但无法弄清楚如何从IDE"热部署"更改的类.
每当我更改一行代码或JSF xhtml文件时,我当前必须重新启动整个应用程序需要大约7秒左右.那不是很有成效.
Spring Boot提供了一个spring-boot-devtools,可以重新加载至少一些类,传统的应用服务器提供热部署协议.Wildfly Swarm还有类似的东西吗?JRebel会帮忙吗?
在以下 build.gradle.kts (Kotlin DSL) 脚本中,IntelliJ 将“mainClassName”标记为红色并抱怨:“无法访问类 'java.lang.String'。检查您的模块类路径是否缺少或冲突的依赖项。”
使用./gradlew clean assemble命令行上,一切正常。
谁能给我一个提示如何解决这个问题?
IntelliJ 是最新版本 2019.1-社区。
------------------------------------------------------------
Gradle 5.3.1
------------------------------------------------------------
Build time: 2019-03-28 09:09:23 UTC
Revision: f2fae6ba563cfb772c8bc35d31e43c59a5b620c3
Kotlin: 1.3.21
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM: 11.0.2 (Oracle Corporation 11.0.2+9)
OS: Linux 4.9.0-8-amd64 amd64
Run Code Online (Sandbox Code Playgroud)
plugins {
java
application
}
group = "de.lathspell"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
testCompile("junit", "junit", "4.12")
}
configure<JavaPluginConvention> {
sourceCompatibility = JavaVersion.VERSION_1_8
}
configure<ApplicationPluginConvention> {
mainClassName …Run Code Online (Sandbox Code Playgroud) 似乎JOOQ完全忽略了数据库列的默认值.既没有更新ActiveRecord对象也没有在INSERT上跳过此列.相反,它尝试将其设置为NULL,这在NOT NULL列上失败.
例:
CREATE TABLE bug (
foo int,
bar int not null default 42
);
BugRecord b = jooq.newRecord(BUG);
b.setFoo(3);
b.store();
assertNotNull(b.getBar()); // fails
Record r = jooq.select().from(BUG).fetchOne();
assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails
// DataMapper pattern
Bug b = new Bug();
b.setFoo(3);
bugDao.insert(b); // Fails because it tries to set "bar" to NULL
Run Code Online (Sandbox Code Playgroud)
我期望的行为是newRecord()使用korrekt值初始化所有默认变量(虽然我知道如果结果是自定义函数的结果,这可能很难:-)).或INSERT INTO执行不要使用默认值插入所有未修改的列,然后INSERT INTO后跟一个SELECT,该SELECT从数据库中获取现有的值(类似于RETURNING).
这真的是一个错误/限制,还是我错过了一些配置选项等,这使得可以使用"not null default"列?
我有两个表,"书籍"和"书店"都有一个@OneToMany引用"book_to_bookstore"表,其中包含了书店中有多少本书的信息.如果删除书籍或书店,那么该信息也应该消失.
因此我使用标准JPA CascadeType.ALL和orphanRemoval = true.为了使"正确"的SQL模式在使用Java访问时也能正常工作,我添加了EclipseLink特定的@CascadeOnDelete注释,期望在两个FOREIGN KEY语句之后出现CASCADE ON DELETE.
有趣的是,它只出现在其中一个我无法解释之后!
我尝试了MySQL和PostgreSQL的DDL生成,但两者都是一样的.
为什么?
一个可编译的迷你项目在这里:svn + ssh://lathspell@svn.code.sf.net/p/lathspellsphp/code/java_test_eclipselink_cascade_bug
重要的课程:
public class Bookstore implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bookstoreId", orphanRemoval = true)
@CascadeOnDelete
private List<BookToBookstore> bookToBookstoreList;
...
public class Book implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bookId", orphanRemoval = true)
@CascadeOnDelete
private List<BookToBookstore> bookToBookstoreList; …Run Code Online (Sandbox Code Playgroud) 以下示例适用于我的Java EE6(Glassfish3)项目,但在切换到Java EE7(Glassfish4)后失败.HTTP请求返回"500内部错误",Glassfish服务器日志中没有任何消息.该项目使用NetBeans8作为Maven Web Project进行设置,没有特殊的依赖项,beans.xml或其他配置.
@RequestScoped
@Path("generic")
public class GenericResource {
@GET
@Path("ping")
@Produces(APPLICATION_JSON)
public List<String> debugPing() {
return Arrays.asList("pong");
}
Run Code Online (Sandbox Code Playgroud)
然后:
$ curl -v http://localhost:8080/mavenproject2/webresources/generic/ping
> GET /mavenproject2/webresources/generic/ping HTTP/1.1
...
< HTTP/1.1 500 Internal Server Error
Run Code Online (Sandbox Code Playgroud)
据我了解,所有REST处理都是由Jackson参考实现完成的,Jackson使用Jersey作为底层JSON库.其中一个应该为所有基本数据类型提供某种提供程序.只有自定义类需要自编写的ObjectMapper.这些概念仍然正确吗?
我正在使用 SpringBoot org.keycloak:keycloak-spring-security-adapter:6.0.1,目前正在通过以下方式访问用户详细信息,例如“family_name”
String familyName = ((KeycloakAuthenticationToken)auth).account.keycloakSecurityContext.idToken.familyName
String employeeId = ((KeycloakAuthenticationToken)auth).account.keycloakSecurityContext.idToken.otherClaims["employeeId"]
Run Code Online (Sandbox Code Playgroud)
现在我想要一个 CustomUser 类,以便我可以通过更优雅的方式访问所有属性(OIDC 以及一些自定义声明)
CustomUser u = ((CustomUser) auth).details
String employeeId = u.employeeId
Run Code Online (Sandbox Code Playgroud)
我应该把映射放在哪里CustomUser?类UserDetailsMapper在这里不起作用,或者?应该AuthenticationProvider.authenticate()通过设置来完成吗authentication.details = <some subclass of KeycloakAccount>?