人。我有一个问题要问你。我正在实现具有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);
}
答案 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已完全初始化。谢谢。