см. Решение от Александр Косарев (выше)
*****************************************************************************************************
Проблему решил, но не уверен, насколько такой подход верен.
Итак, теперь я в контроллере объявляю два сервиса, которые работают с репозиториями и сую их в ArduinoConfig через новосозданный конструктор (см. ниже).
StartControllerpackage com.kovalchuk.server.controller;
import com.kovalchuk.server.config.arduino.ArduinoConfig;
import com.kovalchuk.server.entity.Room;
import com.kovalchuk.server.services.interf.CommitService;
import com.kovalchuk.server.services.interf.RoomService;
import jssc.SerialPortException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class StartController {
@Autowired
private RoomService roomService;
@Autowired
private CommitService commitService;
@RequestMapping(value = "/start", method = RequestMethod.GET)
@ResponseBody
public void startArduinoScan() throws SerialPortException {
//Попробуем завести наш АрдуиноКоннектер
ArduinoConfig arduinoConfig = new ArduinoConfig(roomService,commitService);
arduinoConfig.arduinoConnection();
}
}
В ArduinoConfig определяю Service как поля, и добавляют два Getter-а для них. Ну и да, конструктор соответствующий нарисовал.
ArduinoConfigpackage com.kovalchuk.server.config.arduino;
import com.kovalchuk.server.services.interf.CommitService;
import com.kovalchuk.server.services.interf.RoomService;
import jssc.SerialPort;
import jssc.SerialPortException;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@ComponentScan("com.kovalchuk.server")
@EnableJpaRepositories("com.kovalchuk.server.repository")
public class ArduinoConfig {
private static SerialPort serialPort;
private static RoomService roomService;
private static CommitService commitService;
public ArduinoConfig() {
}
public ArduinoConfig(RoomService roomService, CommitService commitService) {
this.roomService = roomService;
this.commitService = commitService;
}
public static RoomService getRoomService() {
return roomService;
}
public static CommitService getCommitService() {
return commitService;
}
public static SerialPort getSerialPort() {
return serialPort;
}
public void arduinoConnection() throws SerialPortException {
serialPort = new SerialPort("COM3");
try{
serialPort.openPort();
serialPort.setParams(9600,8,1,0);
serialPort.setEventsMask(SerialPort.MASK_RXCHAR);
serialPort.addEventListener(new ArduinoEventsListener());
}
catch (SerialPortException ex){
if (serialPort.isOpened()) serialPort.closePort();
}
}
}
И вот так преобразился ArduinoEventsListener, который, используя гетеры, получает наши Servic-ы для работы с БД.
ArduinoEventsListenerpackage com.kovalchuk.server.config.arduino;
import com.kovalchuk.server.entity.Commit;
import com.kovalchuk.server.entity.Room;
import com.kovalchuk.server.services.interf.CommitService;
import com.kovalchuk.server.services.interf.RoomService;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import java.util.Date;
@ComponentScan("com.kovalchuk.server")
@EnableJpaRepositories("com.kovalchuk.server.repository")
public class ArduinoEventsListener implements SerialPortEventListener {
private SerialPort serialPort = ArduinoConfig.getSerialPort();
private RoomService roomService = ArduinoConfig.getRoomService();
private CommitService commitService = ArduinoConfig.getCommitService();
@Override
public void serialEvent(SerialPortEvent event) {
try {
String buffer = serialPort.readString(15);
String[] data = buffer.split(":");
Commit commit = new Commit();
commit.setTemperature(Double.parseDouble(data[0]));
commit.setWet(data[1]);
commit.setDate(new Date());
Room room = roomService.findByIndex(data[2]);
commit.setRoom(room);
commitService.save(commit);
} catch (SerialPortException e) {
e.printStackTrace();
}
}
}
Решение позволяет записывать данные в таблицу без каких либо проблем, но вот верно ли так делать, я не знаю. Может стоило прямиком из контроллера гетерами цеплять сервисы, чтобы не протягивать их - но насколько это корректно по отношению к самому контроллеру? Работает, но вопросов все равно много.