2016-12-25 67 views
-1

中初始化服務中的自動裝載DAO bean。我有一個問題要問你。我正在實現具有XML-RPC控制器的登錄應用程序,用於解決請求和服務(實現Spring Security UserDetails服務)以實現登錄。用戶登錄數據存儲在嵌入式mongodb數據庫中,DAO訪問它。 因此,當我登錄時,dao幫助服務獲取用戶的數據庫。 Hovewer,在調用服務的時候,DAO沒有初始化(爲空)。我究竟做錯了什麼? 我的控制器類:Spring不會在XML-RPC控制器

@Controller 
public class XmlRpcController { 
private XmlRpcServletServer server; 

@Autowired 
private UserService userService; 

@PostConstruct 
public void init() throws XmlRpcException { 
    try { 
     System.out.println("Starting the server on port 8090"); 
     XmlRpcServerConfigImpl config= new XmlRpcServerConfigImpl(); 

     server=new XmlRpcServletServer(); 
     server.setConfig(config); 

     PropertyHandlerMapping xmlRpcHandlerMapping=new PropertyHandlerMapping(); 
     xmlRpcHandlerMapping.load(Thread.currentThread().getContextClassLoader(),"xmlrpc.properties"); 
     server.setHandlerMapping(xmlRpcHandlerMapping); 
     System.out.println("The server started successfully."); 

    } catch (Exception e) { 
     System.err.println("Server Error: " + e); 
     throw new XmlRpcException(e.getMessage()); 
    } 
} 

@RequestMapping("xmlrpc") 
public void serve(HttpServletRequest request, HttpServletResponse response) throws XmlRpcException { 
    try { 
     server.execute(request,response); 
    } catch (Exception e) { 
     throw new XmlRpcException(e.getMessage(), e); 
    } 
} 
} 

W¯¯xmlrpc.properties服務爲貫徹請求定義:

service=org.vkalashnykov.service.UserService 

服務:

@Service 
public class UserService implements UserDetailsService{ 
    @Autowired 
    private UserDAO userDAO; 

@Override 
    public UserDetails loadUserByUsername(@NotNull String username) throws UsernameNotFoundException { 
     return userDAO.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("user "+username+ " was not found")); // Here the userDAO is null 
    } 

    public String login(@NotNull String username, @NotNull String password){ 
     User user=(User)loadUserByUsername(username); 
     if (user!=null && user.getPassword().equals(new BCryptPasswordEncoder().encode(password))) 
      return Statuses.SUCCESS.name(); 
     else 
      return Statuses.ERROR.name(); 
    } 
} 

DAO:

@Component 
public class UserDAO{ 

@Autowired 
MongoTemplate mongoTemplate; 

public Optional<User> findByUsername(@NotNull String username){ 
    return Optional.ofNullable(mongoTemplate.findOne(
      query(
        where(UserField.USER_NAME.getField()).is(username)), 
        User.class)); 
} 

public void save(User user){ 
    mongoTemplate.save(user); 
} 

} 

春天西沽RITY配置:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter{ 
@Autowired 
private UserService userService; 

@Bean 
public BCryptPasswordEncoder getBCryptPasswordEncoder(){ 
    return new BCryptPasswordEncoder(); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/xmlrpc").permitAll() 
      .and() 
      .csrf().disable(); 
} 

@Autowired 
@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userService).passwordEncoder(getBCryptPasswordEncoder()); 
} 
} 

在客戶端有發送用戶名和密碼,服務器登錄的應用程序:

@FXML 
private TextField login; 

@FXML 
private TextField password; 

private String configuration="xmlrpc"; 

private final String serverUrl="http://localhost:8090/xmlrpc"; 

private final XmlRpcClient xmlRpcClient=new XmlRpcClient(); 

public Controller() throws Exception { 
    final XmlRpcClientConfigImpl config=new XmlRpcClientConfigImpl(); 
    try { 
     System.out.println("Trying connect to server "+serverUrl); 
     config.setServerURL(new URL(serverUrl)); 
    } catch (MalformedURLException e) { 
     System.err.println("Server "+serverUrl+" not found."); 
     e.printStackTrace(); 
     errorLabel.setText("Server not found."); 
     throw new Exception("Server not found."); 
    } 
    xmlRpcClient.setConfig(config); 
    System.out.println("Connected to server: "+serverUrl); 
} 
+0

因此,你期望一個沒有被Spring管理的類實例被Spring注入和控制......你的RPC框架控制着不是Spring的實例,所以沒有什麼是自動裝配的。 –

+0

有沒有辦法可以用RPC來管理spring bean? –

回答

0

我改變控制器的配置,以在明年方式的Apache XML-RPC框架:

@Controller 
public class XmlRpcController { 
    private XmlRpcServletServer server; 
    @Autowired 
    UserService userService; 

    @PostConstruct 
    public void init() throws XmlRpcException { 
    try { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
     System.out.println("Starting the server on port 8090"); 
     XmlRpcServerConfigImpl config= new XmlRpcServerConfigImpl(); 

     server=new XmlRpcServletServer(); 
     server.setConfig(config); 

     PropertyHandlerMapping xmlRpcHandlerMapping=new PropertyHandlerMapping(); 
     xmlRpcHandlerMapping.setRequestProcessorFactoryFactory(pClass->pRequest->userService); 
     xmlRpcHandlerMapping.addHandler(UserService.class.getSimpleName(),UserService.class); 
     XmlRpcSystemImpl.addSystemHandler(xmlRpcHandlerMapping); 
     server.setHandlerMapping(xmlRpcHandlerMapping); 
     System.out.println("The server started successfully."); 

    } catch (Exception e) { 
     System.err.println("Server Error: " + e); 
     throw new XmlRpcException(e.getMessage()); 
    } 
    } 
} 

似乎工作,現在DAO已完全初始化。謝謝。