无法享用休息服务

时间:2019-08-13 13:17:36

标签: java spring rest spring-boot microservices

我想创建两个通过启动调用进行通信的spring-boot项目。第一个包含带有loginForm的UI部分。第二个项目应与数据库进行通信,并应获取有关用户的信息,然后将其发送回UI。

服务项目包含两个模块:数据模块和impl模块。数据项目应包含在UI和服务项目之间共享的公共数据。它应该只是一个jar,我将其添加为UI项目中的依赖项,并将其添加为服务项目中的impl模块。

impl模块应包含实体,存储库,restcontrollers和一个包含应用程序实际后端逻辑的服务层。我已经创建了UI项目,但是服务存在问题。在数据模块中,我在org.tu.userdata包中创建了带有用户信息的类。在服务展示中,我有一个像这样的userController:

package org.tu.userserviceimpl.controller;

@RestController
@RequestMapping("/user")
public class UserController {

private final UserAuthenticationService userService;

@Autowired
public UserController(UserAuthenticationService userService) {
    this.userService = userService;
}

@PostMapping(value = { "/logUser" })
public UserDto logUser(@RequestBody AuthenticateUserDto authenticateUserDto) throws Exception {
    return userService.logUser(authenticateUserDto);
}

@PostMapping(value = { "/register" })
public UserDto register(@RequestBody RegisterUserDto registerUserDto) throws Exception {
    return userService.registerUser(registerUserDto);
}
}

它注入的UserAuthenticationService就像这样实现的接口:

package org.tu.userserviceimpl.service.impl;

@Service
public class UserAuthenticationServiceImpl implements UserAuthenticationService {


private final UserRepository userRepository;

@Autowired
public UserAuthenticationServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}

@Override
public UserDto registerUser(RegisterUserDto registerUserDto) throws AuthenticationException {
    return new UserDto();
}

@Override
public UserDto logUser(AuthenticateUserDto authenticateUserDto)
        throws UserPrincipalNotFoundException, AuthenticationException {
    return new UserDto();
}
}

UserRepository:

package org.tu.userserviceimpl.repository;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

UserEntity findByUsername(String username);

boolean existsByUsername(String username);

boolean existsByEmail(String email);
}

和一个应用程序类:

package org.tu.userserviceimpl;

@SpringBootApplication
public class UserServiceApplication {

public static void main(String[] args) {
    SpringApplication.run(UserServiceApplication.class, args);
}
}

当我运行它时,我得到:

  

********************************应用程序无法启动

     
     

说明:

     

构造函数的参数0   org.tu.userserviceimpl.service.impl.UserAuthenticationServiceImpl   需要一个类型的bean   不能为“ org.tu.userserviceimpl.repository.UserRepository”   找到。

我认为这很奇怪,因为UserRepository应该在该目录可见,因为它的目录位于应用程序类的下面。为了解决这个问题,我在应用程序类上添加了ComponentScan批注:

@ComponentScan("org.tu.userserviceimpl.repository")

之后,该项目可以正常构建和部署,但我无法访问它。我收到404错误。我什至在UserController中添加了一个类似的方法来解决它:

@GetMapping("/hello")
public String hello() {
    return "hello";
}

但是仍然无法访问它。该应用程序部署在端口8082上,但是当我尝试访问“ http://localhost:8082/user/hello”时我无法。之后,我尝试删除UserAuthenticationServiceImpl中注入UserRepository的代码,并删除了componentScan注释。删除此代码后,我可以到达“ http://localhost:8082/user/hello”,并且在那里收到消息“ hello”。这意味着问题出在存储库中。然后我尝试添加:

@EnableJpaRepositories("org.tu.userserviceimpl.repository")
@EntityScan("org.tu.userserviceimpl.entity") 
在应用程序类的顶部

,我添加了代码,再次将存储库注入UserAuthenticationServiceImpl中。这次结果是另一个错误:

Parameter 0 of constructor in org.tu.userserviceimpl.service.impl.UserAuthenticationServiceImpl required a bean named 'entityManagerFactory' that could not be found.

我删除了EntityScan注释,但结果相同。有任何想法吗?我在做什么错了?

我在github中上传了几乎相同的项目:https://github.com/lei-gustavson/user-service.git 谢谢!

3 个答案:

答案 0 :(得分:0)

您已经在UserAuthenticationServiceImpl中创建了基于参数的构造函数。 如下:

public UserAuthenticationServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}

因此 JVM 无法自动创建参数构造器。  
并且下面的行也没有autowired

   private final UserRepository userRepository;

请不添加任何参数构造函数或删除现有的构造函数以解决此问题。

答案 1 :(得分:0)

您可以尝试在下面声明吗?

@EntityScan(“ org”)

我也遇到过同样的问题,但是当我在目录结构中使用上面的语句时,它就起作用了。

注意: 您在@ComponentScan和@EntityScan之间感到困惑。

只需在注解annote上方做一件事,

@ComponentScan("org"), 
@EntityScan("org") and 
@EnableJPARepository("org")

大多数情况下它将为您工作

答案 2 :(得分:0)

谢谢大家为我提供的帮助!我找到了解决方案。问题是我没有JPAConfig文件。这样就解决了问题:

@Configuration
@EnableJpaRepositories("org.tu.userserviceimpl.repository")
public class JPAConfig {
}

此后,我从SpringBootApplication类中删除了ComponentScan批注,一切都已启动并运行