内容协商.请求、响应支持JSON和XML



我面临内容协商的问题,我正在尝试解决它,但不知道确切的方法。这里是端点:

@PostMapping(value = "/v2/transaction", consumes = MediaType.ALL_VALUE, produces = {"application/xml", "application/json"})
public @ResponseBody
ResponseEntity<TransactionResponse> executeTransaction(@RequestBody TransactionRequest request) {
printerService.printRequestLog(request);
TransactionResponse response = null;
try {
response = bhnProcessingService.processTransaction(request);
} catch (GsStatusCodeException gse) {
Map<String, String> responseMap = gse.getResponseMap();
response = gsStatusCodeException.gsStatusCodeExceptionHandling(responseMap, request);
bhnResponseService.save(bhnResponseMapper.dtoToEntity(response));
printerService.printResponseLog(response);
return ResponseEntity.ok(response);
}
printerService.printResponseLog(response);
return ResponseEntity.ok(response);
}

我知道consumesproduces是不必要的,但它是项目风格的句法,所以我保留了它。有一个请求:

@XmlRootElement(name = "request")
@JsonRootName("request")
public class TransactionRequest implements Serializable {
private static final long serialVersionUID = -4928904121335557260L;
public BhnHeader header = new BhnHeader();
public BhnTransaction transaction = new BhnTransaction();
}

传入请求需要转换为另一个对象(简单的DTO),并通过SOAP发送到端服务器。然后,当我得到来自SOAP服务器的响应时,传出DTO将转换回与请求类型相同的对象并发送给请求发起者。如果请求是JSON,那么响应应该是JSON,与XML相同。我不知道如何去做。我找到了一些指南,但它们都包括Spring MVC。比如:

@Configuration
@EnableWebMvc
public class RestApiApplication extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false).
favorParameter(true).
ignoreAcceptHeader(false).
useJaf(false).
defaultContentType(MediaType.APPLICATION_XML).
mediaType("xml", MediaType.APPLICATION_XML).
mediaType("json", MediaType.APPLICATION_JSON);
}

查看pom.xml:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.starter.web.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<version>${spring-boot.starter.ws.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.oxm.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson-dataformat.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring-boot.data.jpa.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.starter.test}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>${spring.ws.version}</version>
</dependency>
<!--Mapper-->
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency><!--todo replace because it too old lib-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!--Database MsSql-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.4.0.jre8</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.4.2</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-groovy-dsl</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</dependency>
</dependencies>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources/schemas</schemaDirectory>
<schemaFiles>CPAMOPP.xsd</schemaFiles>
<outputDirectory>src/main/java</outputDirectory>
<packageName>ch.loyalty.amopp.jaxb</packageName>
<clearOutputDir>false</clearOutputDir>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${basedir}/target/generated-sources</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.0</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
<finalName>transactionManagement</finalName>
</build>
你能就如何解决那个问题给我一些建议吗?很感激!附注:我指的不是硬代码。通常情况下,截止日期是昨天…

解决方案:我将@RequestHeaders HttpHeaders httpHeaders添加到方法参数中,这使我有机会检查出所有HTTP头。每个HTTP请求至少有一个任务标头所需的参数:content-type或accept。所以,这对我和我的问题都有效。希望大家也可以用一下。