小编Mar*_*itt的帖子

kapt生成的代码在编译阶段不可用

我用kapt编写了一个代码生成器,并在一个用maven编译kotlin的项目中使用它.

我发现在Kotlin的编译阶段之后调用了kapt生成器,这阻止了我在同一个项目中使用kotlin中生成的代码.

但是,如果我在同一个项目中从Java中引用生成的类,它可以正常工作.这是因为java编译阶段是在kotlin的生成阶段之后.

我已经在maven配置中的Kotlin编译目标之前指定了kapt目标(如文档中所述)但它似乎没有什么区别:

        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>kapt</id>
                    <goals>
                        <goal>kapt</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>src/main/java</sourceDir>
                        </sourceDirs>
                        <annotationProcessorPaths>
                            <annotationProcessorPath>
                                <groupId>lang.taxi</groupId>
                                <artifactId>taxi-annotation-processor</artifactId>
                                <version>${taxi.version}</version>
                            </annotationProcessorPath>
                        </annotationProcessorPaths>
                    </configuration>
                </execution>
                <execution>
                    <id>compile</id>
                    <goals> <goal>compile</goal> </goals>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals> <goal>test-compile</goal> </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

是否可以配置Kotlin以允许我在同一个项目中使用Kotlin生成的代码?

maven kotlin kapt

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

在一个工厂的构造函数中有太多的params代码味道?

我有一个工厂类,目前在它的构造函数中需要6个参数,我只需要添加另一个.

通常情况下,这会让我感到尖叫:"嘿,你的班级有很多依赖,因此,它做得太多了!"

但是,考虑到这个班级是严格的工厂,那是不是真的如此?我应该关注越来越多的依赖关系吗?如果是这样,我应该考虑采取什么策略进行重构呢?

更新:
我曾考虑过建造者模式,但对于工厂来说,这不是太过分了吗?

(即,WidgetFactoryBuilder构建一个构建小部件的工厂.).

另外,我不明白构建器如何真正减轻我的依赖关系 - 它只是将它们从构造函数移动到方法 - 这似乎使事情变得更加模糊 - 但是这可能归结为对如何应用构建器模式的理解不足在这种情况下.

java design-patterns

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

Spring MVC:用于包装API响应的适当扩展点

我有一个简单的REST API,使用Spring MVC @Controller@RequestMapping.我想开始包装响应以提供额外的元数据.

例如,给定一个会返回的调用

HTTP GET: /users/1
{
    "userName" : "Jack Jackerson"
}
Run Code Online (Sandbox Code Playgroud)

我想把它包起来,如下:

{
    "metadata" : 
    {
        "callLimit" : "50",
        "callsRemaining" : "49"
    },
    "result" :
    {
        "userName" : "Jack Jackerson"
    }
}  ..etc..
Run Code Online (Sandbox Code Playgroud)

另外,我想支持管理列表(limitoffset)的标准参数集.

由于这涉及所有api方法,我想将它实现为一些spring内部服务的装饰器,因此方法本身可以专注于它们的实际逻辑,并保持这个样板内容集中.

我已经开始修饰HttpMessageConverter已经注册的路径,并用装饰器包装它们.

但是,这不能让我访问未声明a的方法的入站请求@RequestBody.(很多人没有)

理想情况下,我需要在堆栈中更高 - RequestResponseBodyMethodProcessor.writeWithMessageConverters()看起来像一个很好的候选人,但我不知道如何在这里挂钩.

Spring MVC有哪些选项可用于实现此类API范围的请求/响应处理?

java spring spring-mvc

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

集成Maven和非maven项目

我目前正在同时开展两个项目:

  • 我的主要项目(用maven建造)
  • 一个开源项目的高峰,我的主要项目依赖于(不是用maven构建)

我如何设置maven以使用OSS项目作为具有最小摩擦力的依赖项,因为我经常将两者串联起来?

maven-2

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

Java样式/最佳实践 - 将字段传递给方法直接访问

在Java中,给出以下类:

public class MyClass {
   private final Dependency dependency;
   public MyClass(Dependency dependency)
   {
       this.dependency = dependency;
   }

   public void doWork()
   {
       // validate dependency...
   }
Run Code Online (Sandbox Code Playgroud)

doWork方法需要调用使用的方法dependency.

以下哪两种变体被认为是"最佳实践",为什么?

   // Access dependency directly
   void validateDependency()
   {
        this.dependency.something();
   }

   // access dependency as passed to the method
   void validateDependency(Dependency dependency)
   {
       dependency.something();
   }
Run Code Online (Sandbox Code Playgroud)

我发现自己偏爱后者,将依赖项直接传递给方法,因为它使得该方法更容易单独测试(虽然是边缘).

但是,我对这里的java约定/最佳实践很感兴趣.

java

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

当双代理接口时,Spring AspectJ失败:无法生成类的CGLIB子类

我正在使用Spring <aop:aspectj-autoproxy />来代理一些JPA存储库接口.

但是,代理失败的情况如下Cannot subclass final class class $Proxy80:

无法生成类[class $ Proxy80]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类; 嵌套异常是java.lang.IllegalArgumentException:不能继承最终类class $ Proxy80

由于错误和快速谷歌建议 - 当代理目标是最终类时会发生这种情况.但是,在这个链中,没有类 - 只有接口.Spring在运行时生成所有实现.

这是失败的接口的定义:

public interface AuthorDAO extends
    CrossStoreJpaRepository<Author,Long>, CrossStoreQueryDslPredicateExecutor<Author> {

}
Run Code Online (Sandbox Code Playgroud)

注意我正在使用spring的JpaRepositoryQueryDslPredicateExecutor的自定义子类,定义如下:

public interface CrossStoreJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {}
public interface CrossStoreQueryDslPredicateExecutor<T> extends QueryDslPredicateExecutor<T>{}
Run Code Online (Sandbox Code Playgroud)

在其他地方,我在这些接口上定义方法的自定义方面:

@Aspect
@Component
public class DocumentLoadingAspect extends AbstractDocumentAspect {

    @Around("execution(* com.mangofactory.crossstore.repository.CrossStore*.find*(..))")
    public Object loadCrossStoreEntity(ProceedingJoinPoint pjp) throws Throwable
    {
         // implementation omitted
    }
Run Code Online (Sandbox Code Playgroud)

我已经确认这些@Aspect定义是通过删除它们并重新运行应用程序而导致问题的.

导致此错误的原因是什么?似乎代理代理由于某种原因失败了.

java spring aspectj

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

Maven - 如何在声明的存储库中验证依赖项?

我刚刚编辑了<repositories />我的pom.xml文件部分的项目,删除了一些我认为不需要的回购.

我想验证声明的依赖项仍然可以在可用的存储库中解析.

但是,所有声明的依赖项都可以在我的本地仓库中使用,因此任何构建的尝试都只使用本地的.

我不想简单地核对我的本地仓库,因为从头开始下载所有依赖项需要花费数小时.

同样,我对maven尝试下载所有依赖项不感兴趣,我只是希望它确保它们都是可解析的(包括传递依赖项).

我该怎么做呢?

java maven

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

Hibernate - 持久的多态连接

我试图了解如何在hibernate中最好地实现多态一对多.

例如:

@MappedSuperclass
public class BaseEntity  {
    Integer id;
    // etc...
}

@Entity
public class Author extends BaseEntity {}

@Entity
public class Post extends BaseEntity {}

@Entity
public class Comment extends BaseEntity {}
Run Code Online (Sandbox Code Playgroud)

现在,我还要保留审计信息,具体如下:

@Entity
public class AuditEvent {
    @ManyToOne // ?
    BaseEntity entity;
}
Run Code Online (Sandbox Code Playgroud)

什么是适当的映射auditEvent.entity?另外,Hibernate将如何实际坚持这一点?将一系列连接的表的生成(AuditEvent_Author,AuditEvent_Post,AuditEvent_Comment),或者是有没有更好的办法?

注意,我宁愿不让我的其他实体类暴露连接的另一面(例如,List<AuditEvent> eventson BaseEntity) - 但如果这是最干净的实现方式,那么它就足够了.

java hibernate

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

GMaven构建失败,"遇到API不兼容"

在尝试使用Maven Gmaven插件编译我的项目时,发生以下错误:

[ERROR] Failed to execute goal org.codehaus.gmaven:gmaven-plugin:1.4:compile (default) on project concorde-web: Execution default of goal org.codehaus.gmaven:gmaven-plugin:1.4:compile failed: An API incompatibility was encountered while executing org.codehaus.gmaven:gmaven-plugin:1.4:compile: java.lang.NoSuchMethodError: org.codehaus.groovy.ast.ModuleNode.getStarImports()Ljava/util/List;

谷歌搜索表明这是因为多个groovy版本在我的依赖链中结束.但是,在检查完整依赖关系树之后,我发现整个树中只有一个依赖关系.

这是我的pom.xml的摘录:

    <!-- Groovy dependencies -->
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>1.8.5</version>
    </dependency>
    <!-- ... snip ... -->

        <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generateStubs</goal>
                        <goal>compile</goal>
                        <goal>generateTestStubs</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
Run Code Online (Sandbox Code Playgroud)

java groovy maven gmaven

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

打字稿:在地图中使用数字作为键

这个答案表明声明一个强制执行number键的地图是有效的.

但是,当我在操场上尝试以下操作时,出现错误.

class Foo
{
    stringMap: { [s: string]: string; } = {};
    numberMap: { [s: number]: string; } = {};
}
Run Code Online (Sandbox Code Playgroud)

numberMap 生成以下编译器错误:

无法转换'{}''{ [s: number]: string; }':类型的索引签名'{}'并且'{ [s: number]: string; }'不兼容{}

宣布这个的正确方法是什么?

typescript

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