0

bonjour, I have a unsolvable problem ... help me I downloaded XML open api file and parsed that in spring boot. Even though mysql db was successfully connected, data wasn't stored in my db table. Only made table.... no data,,, what can i solve this problem?

there are my codes below

Board.java

package com.test.test;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "Animal")
public class Board {

    @Id
    @Column(name = "ABDM_IDNTFY_NO")
    private String abdmIdntfyNo;

    @Column(name = "SIGUN_CD")
    private Integer sigunCd;

    @Column(name = "SIGUN_NM")
    private String sigunNm;

    @Column(name = "THUMB_IMAGE_COURS")
    private String thumbImageCours;

    @Column(name = "RECEPT_DE")
    private String receptDe;

    @Column(name = "DISCVRY_PLC_INFO")
    private String discvryPlcInfo;

    @Column(name = "SPECIES_NM")
    private String speciesNm;

    @Column(name = "COLOR_NM")
    private String colorNm;

    @Column(name = "AGE_INFO")
    private String ageInfo;

    @Column(name = "BDWGH_INFO")
    private Double bdwghInfo;

    @Column(name = "PBLANC_IDNTFY_NO")
    private String pblancIdntfyNo;

    @Column(name = "PBLANC_BEGIN_DE")
    private String pblancBeginDe;

    @Column(name = "PBLANC_END_DE")
    private String pblancEndDe;

    @Column(name = "IMAGE_COURS")
    private String imageCours;

    @Column(name = "STATE_NM")
    private String stateNm;

    @Column(name = "SEX_NM")
    private String sexNm;

    @Column(name = "NEUT_YN")
    private String neutYn;

    @Column(name = "SFETR_INFO")
    private String sfetrInfo;

    @Column(name = "SHTER_NM")
    private String shterNm;

    @Column(name = "SHTER_TELNO")
    private String shterTelno;

    @Column(name = "PROTECT_PLC")
    private String protectPlc;

    @Column(name = "JURISD_INST_NM")
    private String jurisdInstNm;

    @Column(name = "CHRGPSN_NM")
    private String chrgpsnNm;

    @Column(name = "CHRGPSN_CONTCT_NO")
    private String chrgpsnContctNo;

    @Column(name = "PARTCLR_MATR")
    private String partclrMatr;

    @Column(name = "REFINE_LOTNO_ADDR")
    private String refineLotnoAddr;

    @Column(name = "REFINE_ROADNM_ADDR")
    private String refineRoadnmAddr;

    @Column(name = "REFINE_ZIP_CD")
    private String refineZipCd;

    @Column(name = "REFINE_WGS84_LOGT")
    private Double refineWgs84Logt;

    @Column(name = "REFINE_WGS84_LAT")
    private Double refineWgs84Lat;
}

ApiResponse

package com.test.test;

import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@XmlRootElement(name = "AbdmAnimalProtect")
@XmlAccessorType(XmlAccessType.FIELD)
public class ApiResponse {

    @XmlElement(name = "script")
    private String script;

    @XmlElement(name = "head")
    private Head head;

    @XmlElement(name = "row")
    private List<Item> items;

    @Getter
    @Setter
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Head {
        @XmlElement(name = "list_total_count")
        private int listTotalCount;

        @XmlElement(name = "RESULT")
        private Result result;

        @XmlElement(name = "api_version")
        private String apiVersion;

        @Getter
        @Setter
        @XmlAccessorType(XmlAccessType.FIELD)
        public static class Result {
            @XmlElement(name = "CODE")
            private String code;

            @XmlElement(name = "MESSAGE")
            private String message;
        }
    }

    @Getter
    @Setter
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Item {
        @XmlElement(name = "SIGUN_CD")
        private String SIGUN_CD;

        @XmlElement(name = "SIGUN_NM")
        private String SIGUN_NM;

        @XmlElement(name = "ABDM_IDNTFY_NO")
        private String ABDM_IDNTFY_NO;

        @XmlElement(name = "THUMB_IMAGE_COURS")
        private String THUMB_IMAGE_COURS;

        @XmlElement(name = "RECEPT_DE")
        private String RECEPT_DE;

        @XmlElement(name = "DISCVRY_PLC_INFO")
        private String DISCVRY_PLC_INFO;

        @XmlElement(name = "SPECIES_NM")
        private String SPECIES_NM;

        @XmlElement(name = "COLOR_NM")
        private String COLOR_NM;

        @XmlElement(name = "AGE_INFO")
        private String AGE_INFO;

        @XmlElement(name = "BDWGH_INFO")
        private String BDWGH_INFO;

        @XmlElement(name = "PBLANC_IDNTFY_NO")
        private String PBLANC_IDNTFY_NO;

        @XmlElement(name = "PBLANC_BEGIN_DE")
        private String PBLANC_BEGIN_DE;

        @XmlElement(name = "PBLANC_END_DE")
        private String PBLANC_END_DE;

        @XmlElement(name = "IMAGE_COURS")
        private String IMAGE_COURS;

        @XmlElement(name = "STATE_NM")
        private String STATE_NM;

        @XmlElement(name = "SEX_NM")
        private String SEX_NM;

        @XmlElement(name = "NEUT_YN")
        private String NEUT_YN;

        @XmlElement(name = "SFETR_INFO")
        private String SFETR_INFO;

        @XmlElement(name = "SHTER_NM")
        private String SHTER_NM;

        @XmlElement(name = "SHTER_TELNO")
        private String SHTER_TELNO;

        @XmlElement(name = "PROTECT_PLC")
        private String PROTECT_PLC;

        @XmlElement(name = "JURISD_INST_NM")
        private String JURISD_INST_NM;

        @XmlElement(name = "CHRGPSN_NM")
        private String CHRGPSN_NM;

        @XmlElement(name = "CHRGPSN_CONTCT_NO")
        private String CHRGPSN_CONTCT_NO;

        @XmlElement(name = "PARTCLR_MATR")
        private String PARTCLR_MATR;

        @XmlElement(name = "REFINE_LOTNO_ADDR")
        private String REFINE_LOTNO_ADDR;

        @XmlElement(name = "REFINE_ROADNM_ADDR")
        private String REFINE_ROADNM_ADDR;

        @XmlElement(name = "REFINE_ZIP_CD")
        private String REFINE_ZIP_CD;

        @XmlElement(name = "REFINE_WGS84_LOGT")
        private String REFINE_WGS84_LOGT;

        @XmlElement(name = "REFINE_WGS84_LAT")
        private String REFINE_WGS84_LAT;
    }
}

BoardService.java

package com.test.test;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.client.HttpServerErrorException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.util.List;
import java.util.logging.Logger;

@Service
public class BoardService {
    private static final Logger logger = Logger.getLogger(BoardService.class.getName());
    private final BoardRepository boardRepository;
    private final RestTemplate restTemplate;

    //@Autowired
    public BoardService(BoardRepository boardRepository, RestTemplate restTemplate) {
        this.boardRepository = boardRepository;
        this.restTemplate = restTemplate;
    }

    @Transactional
    public void fetchAndSaveData() {
        String apiUrl = "https://openapi.gg.go.kr/AbdmAnimalProtect?KEY=(myprivatekey)=1&pSize=100";

        try {
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
            String xmlData = responseEntity.getBody();

            logger.info("Fetched XML data: " + xmlData); // API 응답 데이터 로깅

            List<ApiResponse.Item> items = parseXmlToItems(xmlData);

            for (ApiResponse.Item item : items) {
                Board board = convertItemToBoard(item);
                try {
                    validateBoard(board);
                    boardRepository.save(board);
                    logger.info("Saved board: " + board);
                } catch (Exception e) {
                    logger.severe("Error saving board: " + e.getMessage());
                    e.printStackTrace();
                }
            }
        } catch (HttpServerErrorException e) {
            logger.severe("Server error: " + e.getMessage());
        } catch (Exception e) {
            logger.severe("An error occurred: " + e.getMessage());
        }
    }

    private List<ApiResponse.Item> parseXmlToItems(String xmlData) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(ApiResponse.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        StringReader reader = new StringReader(xmlData);
        ApiResponse response = (ApiResponse) unmarshaller.unmarshal(reader);
        return response.getItems();
    }

    private Board convertItemToBoard(ApiResponse.Item item) {
        Board board = new Board();
        board.setAbdmIdntfyNo(item.getABDM_IDNTFY_NO());
        board.setSigunCd(parseInteger(item.getSIGUN_CD()));
        board.setSigunNm(item.getSIGUN_NM());
        board.setThumbImageCours(item.getTHUMB_IMAGE_COURS());
        board.setReceptDe(item.getRECEPT_DE());
        board.setDiscvryPlcInfo(item.getDISCVRY_PLC_INFO());
        board.setSpeciesNm(item.getSPECIES_NM());
        board.setColorNm(item.getCOLOR_NM());
        board.setAgeInfo(item.getAGE_INFO());
        board.setBdwghInfo(parseDouble(item.getBDWGH_INFO())); // Unit removed and parsed as double
        board.setPblancIdntfyNo(item.getPBLANC_IDNTFY_NO());
        board.setPblancBeginDe(item.getPBLANC_BEGIN_DE());
        board.setPblancEndDe(item.getPBLANC_END_DE());
        board.setImageCours(item.getIMAGE_COURS());
        board.setStateNm(item.getSTATE_NM());
        board.setSexNm(item.getSEX_NM());
        board.setNeutYn(item.getNEUT_YN());
        board.setSfetrInfo(item.getSFETR_INFO());
        board.setShterNm(item.getSHTER_NM());
        board.setShterTelno(item.getSHTER_TELNO());
        board.setProtectPlc(item.getPROTECT_PLC());
        board.setJurisdInstNm(item.getJURISD_INST_NM());
        board.setChrgpsnNm(item.getCHRGPSN_NM());
        board.setChrgpsnContctNo(item.getCHRGPSN_CONTCT_NO());
        board.setPartclrMatr(item.getPARTCLR_MATR());
        board.setRefineLotnoAddr(item.getREFINE_LOTNO_ADDR());
        board.setRefineRoadnmAddr(item.getREFINE_ROADNM_ADDR());
        board.setRefineZipCd(item.getREFINE_ZIP_CD());
        board.setRefineWgs84Logt(parseDouble(item.getREFINE_WGS84_LOGT()));
        board.setRefineWgs84Lat(parseDouble(item.getREFINE_WGS84_LAT()));

        logger.info("Converted board: " + board);

        return board;
    }

    private Integer parseInteger(String value) {
        try {
            return value != null ? Integer.parseInt(value) : null;
        } catch (NumberFormatException e) {
            logger.severe("Failed to parse integer: " + value);
            return null;
        }
    }

    private Double parseDouble(String value) {
        try {
            if (value != null) {
                // Remove any non-numeric characters (like units) and then parse
                value = value.replaceAll("[^\\d.]", "");
                return Double.parseDouble(value);
            } else {
                return null;
            }
        } catch (NumberFormatException e) {
            logger.severe("Failed to parse double: " + value);
            return null;
        }
    }

    private void validateBoard(Board board) throws Exception {
        // Add your validation logic here
        if (board.getAbdmIdntfyNo() == null || board.getAbdmIdntfyNo().isEmpty()) {
            throw new Exception("ABDM_IDNTFY_NO is missing");
        }
        // Add other validation checks as needed
    }
}

thank you. worldwide developers.. sauve moi ,,

endless correction,,

1
  • 2
    have you tried debugging it? What do the logs say?
    – J Asgarov
    Commented Jul 8 at 11:42

0

Browse other questions tagged or ask your own question.