Spring Rest -> Hibernate сущность в JSON - PullRequest
0 голосов
/ 23 октября 2018

Я создаю REST API с использованием Spring Framework.Моя сущность основана на одной таблице, и REST API должен вызываться с использованием операции POST с нижеприведенной структурой JSON.Может кто-нибудь объяснить мне, как отобразить класс сущности так, чтобы он мог использовать ниже показанный json.Поскольку моя сущность основана только на одной таблице, я не могу понять, как она может создавать вложенные объекты json для тех же свойств таблицы.

{
    "process_ar_receipt": {
        "message_header": {
            "source_system_guid": "DDED-DBCD-REV-E1F4343DB3434",
            "source_system": "MeSo_TravelAds"
        },
        "receipt_header": {
            "customer_number": "123",
            "source_receipt_number": "TESTRCPT_1523",
            }
        }
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

псевдокод, принимающий класс Entity равным

@Entity(name="foo") 
class Data{
    @Id
    private String source_system_guid;
    @Column
    private String source_system;
    @Column
    private String customer_number;
    @Column
    private String source_receipt_number;

    public Data() {}
    public Data(String ssId, String sourceSystm, String custNum, String srcRcptNum) {
        this.source_system_guid = ssId;
        this.source_system = sourceSystm;
        this.customer_number = custNum;
        this.source_receipt_number = srcRcptNum;
    }
    public String getSource_system_guid() {
        return source_system_guid;
    }
    public void setSource_system_guid(String source_system_guid) {
        this.source_system_guid = source_system_guid;
    }
    public String getSource_system() {
        return source_system;
    }
    public void setSource_system(String source_system) {
        this.source_system = source_system;
    }
    public String getCustomer_number() {
        return customer_number;
    }
    public void setCustomer_number(String customer_number) {
        this.customer_number = customer_number;
    }
    public String getSource_receipt_number() {
        return source_receipt_number;
    }
    public void setSource_receipt_number(String source_receipt_number) {
        this.source_receipt_number = source_receipt_number;
    }
}

Теперь, поскольку ваш DTO / BO, т.е. объект передачи данных или бизнес-объект, отличается от фактического объекта, мы создадим требуемый объект BO, как показано ниже

class DataTO{
    @JsonProperty("process_ar_receipt")
    private ReceiptTO receiptTO=new ReceiptTO();       
    public ReceiptTO getReceiptTO() {
        return receiptTO;
    }
    public void setReceiptTO(ReceiptTO receiptTO) {
        this.receiptTO = receiptTO;
    }
}
class ReceiptTO{
    @JsonProperty("message_header")
    private MessageHeader messageHeder = new MessageHeader();
    @JsonProperty("receipt_header")
    private ReceiptHeader receiptHeder = new ReceiptHeader();

    public MessageHeader getMessageHeder() {
        return messageHeder;
    }
    public void setMessageHeder(MessageHeader messageHeder) {
        this.messageHeder = messageHeder;
    }
    public ReceiptHeader getReceiptHeder() {
        return receiptHeder;
    }
    public void setReceiptHeder(ReceiptHeader receiptHeder) {
        this.receiptHeder = receiptHeder;
    }  
}
class MessageHeader{
    @JsonProperty("source_System_Guid")
    private String sourceSystemId;
    @JsonProperty("system_Id")
    private String systemId;

    public String getSourceSystemId() {
        return sourceSystemId;
    }
    public void setSourceSystemId(String sourceSystemId) {
        this.sourceSystemId = sourceSystemId;
    }
    public String getSystemId() {
        return systemId;
    }
    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }
}
class ReceiptHeader{
    @JsonProperty("customer_number")
    private String customerNumber;
    @JsonProperty("source_rcpt_number")
    private String sourceReceiptNumber;

    public String getCustomerNumber() {
        return customerNumber;
    }
    public void setCustomerNumber(String customerNumber) {
        this.customerNumber = customerNumber;
    }
    public String getSourceReceiptNumber() {
        return sourceReceiptNumber;
    }
    public void setSourceReceiptNumber(String sourceReceiptNumber) {
        this.sourceReceiptNumber = sourceReceiptNumber;
    }
}

Аннотация @JsonProperty импортируется из org.codehaus.jackson.annotate.JsonProperty;т.е. от Джексона Джара

Теперь класс Simple Test для демонстрации DTO / BO и обратно Конвертация сущностей

public class Test{
    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        List<Data> datas = new ArrayList<Data>();
        datas.add(new Data("DDED-DBCD-REV-E1F4343DB3434","MeSo_TravelAds","123","TESTRCPT_1523"));
        datas.add(new Data("ADED-EWQD-REV-E1F4343YG3434","FooSo_MusicAds","132","TESTRCPT_1523"));
        datas.add(new Data("YDED-YUTR-REV-E1F43UIDB3434","BarSo_HealthAds","143","TESTRCPT_1523"));

        List<DataTO> dataTOs = new ArrayList<DataTO>();
        for (Data data : datas) {
            DataTO dataTO = new DataTO();
            dataTO.getReceiptTO().getMessageHeder().setSourceSystemId(data.getSource_system_guid());
            dataTO.getReceiptTO().getMessageHeder().setSystemId(data.getSource_system());
            dataTO.getReceiptTO().getReceiptHeder().setCustomerNumber(data.getCustomer_number());
            dataTO.getReceiptTO().getReceiptHeder().setSourceReceiptNumber(data.getSource_receipt_number());
            dataTOs.add(dataTO);
        }
        ObjectMapper mapper = new ObjectMapper();
        String str = mapper.writeValueAsString(dataTOs);
        System.out.println(str);

    }
}

Это даст вам результат ниже

[  
   {  
      "process_ar_receipt":{  
         "message_header":{  
            "source_System_Guid":"DDED-DBCD-REV-E1F4343DB3434",
            "system_Id":"MeSo_TravelAds"
         },
         "receipt_header":{  
            "customer_number":"123",
            "source_rcpt_number":"TESTRCPT_1523"
         }
      }
   },
   {  
      "process_ar_receipt":{  
         "message_header":{  
            "source_System_Guid":"ADED-EWQD-REV-E1F4343YG3434",
            "system_Id":"FooSo_MusicAds"
         },
         "receipt_header":{  
            "customer_number":"132",
            "source_rcpt_number":"TESTRCPT_1523"
         }
      }
   },
   {  
      "process_ar_receipt":{  
         "message_header":{  
            "source_System_Guid":"YDED-YUTR-REV-E1F43UIDB3434",
            "system_Id":"BarSo_HealthAds"
         },
         "receipt_header":{  
            "customer_number":"143",
            "source_rcpt_number":"TESTRCPT_1523"
         }
      }
   }
]

аналогичнодругое преобразование

    String input = "{  \r\n" + 
                    "      \"process_ar_receipt\":{  \r\n" + 
                    "         \"message_header\":{  \r\n" + 
                    "            \"source_System_Guid\":\"ADED-EWQD-REV-E1F4343YG3434\",\r\n" + 
                    "            \"system_Id\":\"FooSo_MusicAds\"\r\n" + 
                    "         },\r\n" + 
                    "         \"receipt_header\":{  \r\n" + 
                    "            \"customer_number\":\"132\",\r\n" + 
                    "            \"source_rcpt_number\":\"TESTRCPT_1523\"\r\n" + 
                    "         }\r\n" + 
                    "      }\r\n" + 
                    "   }";
            DataTO dataTO = mapper.readValue(input, DataTO.class);
            System.out.println(dataTO.getReceiptTO().getMessageHeder().getSourceSystemId());
            System.out.println(dataTO.getReceiptTO().getMessageHeder().getSystemId());
            System.out.println(dataTO.getReceiptTO().getReceiptHeder().getCustomerNumber());
System.out.println(dataTO.getReceiptTO().getReceiptHeder().getSourceReceiptNumber());

это напечатает

ADED-EWQD-REV-E1F4343YG3434
FooSo_MusicAds
132

TESTRCPT_1523

Вам не нужно использовать код сопоставления, вы можете напрямую добавить конвертер Джексона как HttpMessageConverted, который будетпреобразовать JSON в Java-объект автоматически

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

 ... other configurations

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
        builder.serializationInclusion(Include.NON_EMPTY);
        builder.indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
}
0 голосов
/ 24 октября 2018

вы можете использовать Gson для преобразования JSON в DTO

https://jarroba.com/gson-json-java-ejemplos/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...