小编kaq*_*qao的帖子

在Java 9中加载类和资源

我正在阅读InfoQ上引用Reinhold的这篇文章:

开发人员仍然可以使用Java 9中的Java类路径为Java运行时搜索类和资源文件.只是使用Java 9的模块,开发人员不再需要类路径.

所以现在我的问题是:执行上面列出的任务的Java 9方法是什么?如何动态加载例如图像(缺少相对路径的摆弄)?

更有趣的是,如何检查一个类是否可用并动态做出决定(例如,检查Jackson是否可用,如果是,请将其用于JSON序列化,如果不使用别的东西)?

文章还提到Spring Boot已经支持Java 9,Spring Boot肯定会做很多动态加载.那么也许有人知道Spring可以看到的代码片段?

java java-platform-module-system spring-boot java-9

39
推荐指数
2
解决办法
8575
查看次数

调试Maven测试时,IntelliJ IDEA调试器会跳过断点

我正在尝试在IntelliJ IDEA中调试Maven测试.当我打开IDEA的Maven Projects视图并右键单击测试目标时,我会选择调试它.单击它会执行此目标,但执行永远不会在任何断点处停止.我错过了什么?

谢谢.

junit maven-2 unit-testing intellij-idea

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

如何从List <T>获取Class <T>

我不得不问这个问题,我感到非常愚蠢,但我不明白为什么下面的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();

编辑:

  1. 找到了静态类型擦除意味着什么的很好的解释.

  2. 有一种方法可以使用子类保留泛型类型信息,称为超类型令牌.现在删除的答案有助于指出Guava库有一个方便的实用程序来利用它.

  3. 这是一篇关于反射性地提取泛型类型和一个很好的库的文章,名为GenTyRef,简化了它

  4. 我分叉了GenTyRef以增加对使用AnnotatedTypes的支持(在Java 8中引入).它被称为GenAnTyRef(它在Maven Central中)

java generics reflection

18
推荐指数
1
解决办法
6673
查看次数

在Java 9中运行时扫描类路径/模块路径

我似乎无法找到关于是否仍然可以在运行时扫描所有可用类(用于接口,注释等)的任何信息,就像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

17
推荐指数
1
解决办法
4206
查看次数

Gradle项目中的依赖关系图

有没有办法获得相当于Maven依赖图,但是对于IntelliJ IDEA Ultimate中的Gradle项目?

[编辑]这个问题也没有要求场外资源.它要求有关的IntelliJ使用,正是因为__CODE__标签指示:

有关Community和Ultimate Editions中的使用和问题的问题应使用此标记.

intellij-idea gradle

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

Graphql - 如何执行where子句

我是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)

graphql graphql-js

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

理解Reader monad

我正在通过示例阅读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标签.

monads haskell state-monad reader-monad purescript

11
推荐指数
1
解决办法
790
查看次数

在 Jackson 的 JsonDeserializer 中获取检测到的泛型类型

由于外部原因,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)

即它以一种理智的方式提供对预期类型的​​访问。

java generics json jackson jackson-databind

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

为什么类型推断在这里失败?

所以,我制作了这个相对简单的代码,并且我和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)

java generics intellij-idea java-8

8
推荐指数
1
解决办法
185
查看次数

oAuth2客户端在Spring Security中使用密码授予

我正在使用一组受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 spring spring-security oauth-2.0

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