我是Spring Boot的新手,也是Java / Maven的新手,所以我很确定在使用DAL项目和Web服务项目方面我有一些基本的错误配置,但我很难弄清楚。
如果我的解释不充分,我可以附加.POM文件或添加更多代码 - 我希望Spring Boot高级用户可能会有一些明显的错误。甚至建议开启更多日志记录,这样我就可以看到为什么Spring Boot认为在这种情况下必须登录到stderr会很棒。
我的基本设置是 - 我有2个Spring Boot项目:
DAL项目。这使用Postgres / JPA来设置我的数据库,并允许我们项目的路由组件在内部使用DAL。这将DAL的所有存储库设置为不在外部公开 - 例如:
@RepositoryRestResource(collectionResourceRel = "user", path = "user", exported=false)
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
}
一个Web服务项目,它将负责任何业务逻辑并向最终用户公开端点。我们的路由组件不需要此逻辑。这也暴露了REST端点,例如:
@RestController
@RequestMapping(value = "/auditentries")
@Api(value = "Audit Entries", description = "Audit Entries API")
public class AuditEntryController extends BaseController<AuditEntry, AuditEntryService> {
}
当我将Web服务作为Spring Boot应用程序运行时,端点被正确公开,我可以使用REST客户端访问/ auditentries或我已配置的其他外部端点。 DAL也基本上工作,因为它使用Hibernate和Web服务使用的内部PagingAndSortingRepository类来设置表。所以 - 这很好 - 项目设置的主要用例似乎没有问题。
然而,到目前为止我已经注意到了两个问题 - 也许我错过了一些东西,但我甚至无法弄清楚如何调试它们或者说明为什么Spring Boot在这些情况下会感到困惑:
默认情况下,Spring Boot会记录到控制台,因此即使配置了日志文件,因此在此帖子末尾的日志记录也会始终发送到控制台和stderr。
如果我尝试在Web Service项目中启用安全性,Spring Boot会在所有端点上启用安全性,但它无法识别应该定义我的安全性的自定义类:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
}
我认为这两个问题都与在Web服务项目中将DAL项目包含在POM文件中有关,因为如果我将项目简化为基本上不再依赖于DAL的Spring启动项目(或者做任何其他有趣的事情),我的安全配置类被调用,并且日志记录似乎按预期工作。
目前的一个潜在问题是DAL和Web Service的POM文件都包含了大多数依赖关系,例如spring-boot-starter-data-rest,postgres,jpa等。也许Web服务应该只依赖于DAL的POM依赖包含完全包含在内,但我不知道为什么这会导致错误,即使最好的做法是明确地在两个项目中包含依赖项。
我正在制作一个无效的假设或一些弹簧配置我应该在DAL中关闭以使两个项目一起工作? Spring Boot是否可能不同于两个项目都有REST端点但只暴露了一组端点?如何在不诉诸试错和暴力的情况下调试此问题?
以下是Web服务项目的一些示例日志记录,即使配置了日志记录,也始终会进入控制台:
[main] INFO CNER.WS.App - 在带有PID 5072的mschwartz-w550s上启动应用程序(C:\ dev \ event_router \ server \ WebServices \ WS \ target \ classes由mschwartz在C:\ dev \ event_router \中启动服务器\ Web服务\ WS) [main] INFO CNER.WS.App - 以下配置文件处于活动状态:默认 [main] INFO org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - 刷新org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@10feca44:启动日期[Fri Mar 25 05:24:02 UTC 2016];上下文层次结构的根 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - 覆盖bean的bean定义&#39; beanNameViewResolver&#39;使用不同的定义:替换[Root bean:class [null];范围=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初级= FALSE; factoryBeanName = org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration; factoryMethodName = beanNameViewResolver; initMethodName = NULL; destroyMethodName =(推断);在类路径资源[org / springframework / boot / autoconfigure / web / ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration.class]中定义[Root bean:class [null];范围=;抽象= FALSE; lazyInit = FALSE; autowireMode = 3; dependencyCheck = 0; autowireCandidate = TRUE;初级= FALSE; factoryBeanName = org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter; factoryMethodName = beanNameViewResolver; initMethodName = NULL; destroyMethodName =(推断);在类路径资源中定义[org / springframework / boot / autoconfigure / web / WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter.class]] [main] INFO org.springframework.context.support.PostProcessorRegistrationDelegate $ BeanPostProcessorChecker - Bean&#39; org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfiguration&#39;类型[class org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfiguration $$ EnhancerBySpringCGLIB $$ 8c5fa87b]类型不适合所有BeanPostProcessors处理(例如:不符合自动代理条件) [main] INFO org.springframework.context.support.PostProcessorRegistrationDelegate $ BeanPostProcessorChecker - Bean&#39; org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration&#39;类型为[class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration $$ EnhancerBySpringCGLIB $$ 82f8180d],不适合所有BeanPostProcessors处理(例如:不符合自动代理条件) [main] INFO org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer - 使用端口初始化的Tomcat:8187(http) [主要] INFO org.apache.catalina.core.StandardService - 启动服务Tomcat
以下是DAL项目中正确进入日志文件的一些示例记录 - 您可以看到它与DAL特定的实现和Hibernate相关。
INFO 2016-03-25 00:24:00,985 [main] CNER.WS.App:main(54):启动服务器... INFO 2016-03-25 05:24:01,955 [background-preinit] org.hibernate.validator.internal.util.Version:(17):HV000001:Hibernate Validator 5.2.2.Final INFO 2016-03-25 05:24:06,669 [localhost-startStop-1] org.hibernate.jpa.internal.util.LogHelper:logPersistenceUnitInformation(46):HHH000204:处理PersistenceUnitInfo [ 名称:默认 ...]
答案 0 :(得分:0)
您的数据访问层听起来像是您想要发布到Maven的JAR,然后让您的网络层使用其pom下拉。
很明显两者之间的依赖关系必须匹配。
我想知道为什么你不写Spring Boot REST data services并将两者结合起来。这就是你在做什么?
答案 1 :(得分:0)
解决了.pom文件更改以进行日志记录,并将以下内容添加到ComponentScan以获取WebSecurityConfigurerAdapter的实现
@ComponentScan(basePackages= {"repo", "wstest.controllers", "wstest.services", "wstest"})