开发人员仍然可以使用Java 9中的Java类路径为Java运行时搜索类和资源文件.只是使用Java 9的模块,开发人员不再需要类路径.
所以现在我的问题是:执行上面列出的任务的Java 9方法是什么?如何动态加载例如图像(缺少相对路径的摆弄)?
更有趣的是,如何检查一个类是否可用并动态做出决定(例如,检查Jackson是否可用,如果是,请将其用于JSON序列化,如果不使用别的东西)?
文章还提到Spring Boot已经支持Java 9,Spring Boot肯定会做很多动态加载.那么也许有人知道Spring可以看到的代码片段?
我正在尝试在IntelliJ IDEA中调试Maven测试.当我打开IDEA的Maven Projects视图并右键单击测试目标时,我会选择调试它.单击它会执行此目标,但执行永远不会在任何断点处停止.我错过了什么?
谢谢.
我不得不问这个问题,我感到非常愚蠢,但我不明白为什么下面的Java代码没有编译:
void <T> doSomething(List<T> items) {
Class<? extends T> clazz = items.get(0).getClass();
...
}
Run Code Online (Sandbox Code Playgroud)
来自Java doc:
实际的结果类型是Class <?extends | X |> where | X | 是调用getClass的表达式的静态类型的擦除.例如,此代码片段中不需要强制转换:
数n = 0; 班级<?extends Number> c = n.getClass();
编辑:
我似乎无法找到关于是否仍然可以在运行时扫描所有可用类(用于接口,注释等)的任何信息,就像Spring,Reflections和许多其他框架和库当前所做的那样,面对Jigsaw相关的更改类的加载方式.
编辑:这个问题是关于扫描寻找类的真实物理文件路径.另一个问题是关于动态加载类和资源.这是相关的,但非常重复.
更新:Jetty项目为此制定了标准化API的 JEP建议.如果你有办法帮助实现这个目标,请做.否则,等待和希望.
更新2:找到这个相关的发声帖子.引用后代的代码片段:
如果您真的只是想了解启动层中的模块内容(启动时解析的模块),那么您将执行以下操作:
ModuleLayer.boot().configuration().modules().stream()
.map(ResolvedModule::reference)
.forEach(mref -> {
System.out.println(mref.descriptor().name());
try (ModuleReader reader = mref.open()) {
reader.list().forEach(System.out::println);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
});
Run Code Online (Sandbox Code Playgroud) java classpath java-platform-module-system java-9 java-module
有没有办法获得相当于Maven依赖图,但是对于IntelliJ IDEA Ultimate中的Gradle项目?
[编辑]这个问题也没有要求场外资源.它要求有关的IntelliJ使用,正是因为__CODE__标签指示:
有关Community和Ultimate Editions中的使用和问题的问题应使用此标记.
我是graphql的新手,我正在努力查询.我想通过他们的电子邮件地址返回用户
我有一个类型定义的调用V1User,它有以下字段id,email,password,role
在此查询中需要更改哪些内容才能根据电子邮件返回用户?
query GetAllV1User {
viewer {
allV1Users{
edges {
node {
id
email
role
createdAt
modifiedAt
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个查询
query getV1UserQuery($email: String!) {
getV1User(email: $email) {
id
email
}
}
Run Code Online (Sandbox Code Playgroud)
有了这些参数
{"email": "test@test.com"}
Run Code Online (Sandbox Code Playgroud)
但是得到以下错误
{
"errors": [
{
"message": "Unknown argument \"email\" on field \"getV1User\" of type \"Query\".",
"locations": [
{
"line": 2,
"column": 13
}
],
"name": "GraphQLError"
},
{
"message": "Field \"getV1User\" argument \"id\" of type \"ID!\" is required but not provided.",
"locations": …Run Code Online (Sandbox Code Playgroud) 我正在通过示例阅读Purescript并介绍了阅读Monad的部分.这个例子是这样的:
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
Run Code Online (Sandbox Code Playgroud)
对我来说令人困惑的部分是ask功能.签名是:
ask :: forall r. Reader r r
Run Code Online (Sandbox Code Playgroud)
它看起来好像是凭空创造了一个阅读器
当我读到Statemonad时,它的get功能与概念相同.文字解释说:
状态被实现为State monad的数据构造函数隐藏的函数参数,因此没有明确的引用传递.
我猜这是关键,同样的事情发生在这里与读者,但我不明白它是如何工作的......
当上面的例子运行时runReader,提供的值如何突然出现ask?Haskell文档ask说:检索monad环境.但我的困惑是从哪里来的?我看到它的方式,一个值传递给runReader,存储在某个地方,并得到它 - 你打电话ask......但这没有任何意义.
虽然这个例子是Purescript,但我猜测任何有Haskell识字的人也能够回答,因此Haskell标签.
由于外部原因,Map我系统中的所有 java只能作为来自客户端的键值对列表接收,例如 aMap<String, Book>实际上将作为 Json-serialized 接收List<MapEntry<String, Book>>。这意味着我需要自定义我的 Json 反序列化过程以期望这种地图表示。
问题是JsonDeserializer让我实施
deserialize(JsonParser p, DeserializationContext ctxt)
Run Code Online (Sandbox Code Playgroud)
无法访问检测到的应该反序列化的泛型类型的方法(Map<String, Book>在上面的示例中)。如果没有这些信息,我将无法在List<MapEntry<String, Book>>不失去类型安全性的情况下反序列化。
我正在查看Converter但它提供的上下文更少。
例如
public Map<K,V> convert(List<MapToListTypeAdapter.MapEntry<K,V>> list) {
Map<K,V> x = new HashMap<>();
list.forEach(entry -> x.put(entry.getKey(), entry.getValue()));
return x;
}
Run Code Online (Sandbox Code Playgroud)
但这可能会创建危险的映射,ClassCastException在检索时会抛出异常,因为无法检查类型是否实际合理。有没有办法解决这个问题?
作为我期望的一个例子,GsonJsonDeserializer看起来像这样:
T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
Run Code Online (Sandbox Code Playgroud)
即它以一种理智的方式提供对预期类型的访问。
所以,我制作了这个相对简单的代码,并且我和IntelliJ IDEA都没有看到它有什么问题,但是javac在标记的行上徘徊,抱怨它无法推断出类型:
import java.util.List;
import java.util.stream.Collectors;
public class GenericsBreakJavac8 {
public interface Edge<N> {
N getNode();
}
@FunctionalInterface
public interface EdgeCreator<N, E extends Edge<N>> {
E createEdge(N node);
}
public static <N> List<Edge<N>> createEdges(List<N> nodes) {
return createEdges(nodes, DefaultEdge::new); //the deadly line
}
//THE NEWLY ADDED LINE (see the edit note)
public static <N> List<Edge<N>> createEdges2(List<N> nodes) {
return createEdges(nodes, n -> new DefaultEdge<N>(n));
}
public static <N, E extends Edge<N>> List<E> createEdges(List<N> nodes, EdgeCreator<N, E> edgeCreator) { …Run Code Online (Sandbox Code Playgroud) 我正在使用一组受oAuth2保护的服务.它目前的工作方式如下:客户端使用用户名和密码登录.我交换这些代币.我将令牌保留在会话中,并在每次要呼叫服务时提交.它可以工作,但问题是我完全手动执行此操作,而不使用Spring Security oAuth2支持.以下是它的外观:
<!-- Configure Authentication mechanism -->
<authentication-manager alias="authenticationManager">
<authentication-provider ref="oAuth2AuthenticationProvider"/>
</authentication-manager>
<beans:bean id="oAuth2AuthenticationProvider" class="my.custom.Oauth2AuthenticationProvider">
<beans:constructor-arg name="accessTokenUri" value="http://x.x.x.x/oauth/token"/>
<beans:constructor-arg name="clientId" value="myClientId"/>
<beans:constructor-arg name="clientSecret" value="myClientSecret"/>
<beans:constructor-arg name="scope">
<beans:list>
<beans:value>myScope</beans:value>
</beans:list>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="resourceOwnerPasswordAccessTokenProvider" class="org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider"/>
Run Code Online (Sandbox Code Playgroud)
如您所见,我自己创建了身份验证提供程序.它接受标准,UsernamePasswordAuthenticationToken但正在生成我自己的扩展,保持实际OAuth2AccessToken,从而将其保持在安全上下文中.
public class Oauth2AuthenticationProvider implements AuthenticationProvider {
@Autowired
private ResourceOwnerPasswordAccessTokenProvider provider;
private String accessTokenUri;
private String clientId;
private String clientSecret;
private List<String> scope;
public Oauth2AuthenticationProvider(String accessTokenUri, String clientId, String clientSecret, List<String> scope) {
this.accessTokenUri = accessTokenUri;
this.clientId = clientId;
this.clientSecret = …Run Code Online (Sandbox Code Playgroud) java ×6
generics ×3
java-9 ×2
java-platform-module-system ×2
classpath ×1
gradle ×1
graphql ×1
graphql-js ×1
haskell ×1
jackson ×1
java-8 ×1
java-module ×1
json ×1
junit ×1
maven-2 ×1
monads ×1
oauth-2.0 ×1
purescript ×1
reader-monad ×1
reflection ×1
spring ×1
spring-boot ×1
state-monad ×1
unit-testing ×1