我用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生成的代码?
我有一个工厂类,目前在它的构造函数中需要6个参数,我只需要添加另一个.
通常情况下,这会让我感到尖叫:"嘿,你的班级有很多依赖,因此,它做得太多了!"
但是,考虑到这个班级是严格的工厂,那是不是真的如此?我应该关注越来越多的依赖关系吗?如果是这样,我应该考虑采取什么策略进行重构呢?
更新:
我曾考虑过建造者模式,但对于工厂来说,这不是太过分了吗?
(即,WidgetFactoryBuilder构建一个构建小部件的工厂.).
另外,我不明白构建器如何真正减轻我的依赖关系 - 它只是将它们从构造函数移动到方法 - 这似乎使事情变得更加模糊 - 但是这可能归结为对如何应用构建器模式的理解不足在这种情况下.
我有一个简单的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)
另外,我想支持管理列表(limit和offset)的标准参数集.
由于这涉及所有api方法,我想将它实现为一些spring内部服务的装饰器,因此方法本身可以专注于它们的实际逻辑,并保持这个样板内容集中.
我已经开始修饰HttpMessageConverter已经注册的路径,并用装饰器包装它们.
但是,这不能让我访问未声明a的方法的入站请求@RequestBody.(很多人没有)
理想情况下,我需要在堆栈中更高 - RequestResponseBodyMethodProcessor.writeWithMessageConverters()看起来像一个很好的候选人,但我不知道如何在这里挂钩.
Spring MVC有哪些选项可用于实现此类API范围的请求/响应处理?
我目前正在同时开展两个项目:
我如何设置maven以使用OSS项目作为具有最小摩擦力的依赖项,因为我经常将两者串联起来?
在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约定/最佳实践很感兴趣.
我正在使用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的JpaRepository和QueryDslPredicateExecutor的自定义子类,定义如下:
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定义是通过删除它们并重新运行应用程序而导致问题的.
导致此错误的原因是什么?似乎代理代理由于某种原因失败了.
我刚刚编辑了<repositories />我的pom.xml文件部分的项目,删除了一些我认为不需要的回购.
我想验证声明的依赖项仍然可以在可用的存储库中解析.
但是,所有声明的依赖项都可以在我的本地仓库中使用,因此任何构建的尝试都只使用本地的.
我不想简单地核对我的本地仓库,因为从头开始下载所有依赖项需要花费数小时.
同样,我对maven尝试下载所有依赖项不感兴趣,我只是希望它确保它们都是可解析的(包括传递依赖项).
我该怎么做呢?
我试图了解如何在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) - 但如果这是最干净的实现方式,那么它就足够了.
在尝试使用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) 这个答案表明声明一个强制执行number键的地图是有效的.
但是,当我在操场上尝试以下操作时,出现错误.
class Foo
{
stringMap: { [s: string]: string; } = {};
numberMap: { [s: number]: string; } = {};
}
Run Code Online (Sandbox Code Playgroud)
numberMap 生成以下编译器错误:
无法转换
'{}'为'{ [s: number]: string; }':类型的索引签名'{}'并且'{ [s: number]: string; }'不兼容{}
宣布这个的正确方法是什么?