Spring没有在XML-RPC控制器

时间:2016-12-25 17:53:44

标签: mongodb spring-boot spring-security xml-rpc xmlrpcclient

人。我有一个问题要问你。我正在实现具有XML-RPC控制器的登录应用程序,用于解析请求和服务(实现Spring Security UserDetails Service)以实现登录。用户登录的数据存储在嵌入式mongodb数据库中,DAO访问它。 因此,当我登录时,在dao的帮助下服务会访问数据库以供用户使用。 Hovewer,在调用服务时,DAO未初始化(为空)。我究竟做错了什么? 我的控制器类:

@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);
}

}

Spring Security配置:

@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);
}

1 个答案:

答案 0 :(得分: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已完全初始化。谢谢。