Java 过帐文件Rest模板
我正试图通过rest调用发布文件。我要发布的文件是一个xml文件。出于授权目的,我还需要在标题中包含数据。通过一些挖掘,看起来我应该将这些头和文件放入一个映射中,该映射可以传递给rest模板的交换方法。这是我的源代码Java 过帐文件Rest模板,java,xml,spring,rest,spring-mvc,Java,Xml,Spring,Rest,Spring Mvc,我正试图通过rest调用发布文件。我要发布的文件是一个xml文件。出于授权目的,我还需要在标题中包含数据。通过一些挖掘,看起来我应该将这些头和文件放入一个映射中,该映射可以传递给rest模板的交换方法。这是我的源代码 public class BaseTest { private RestTemplate restTemplate; private HttpHeaders headers; private HttpEntity<String> httpEnti
public class BaseTest {
private RestTemplate restTemplate;
private HttpHeaders headers;
private HttpEntity<String> httpEntity;
private ResponseEntity<String> statusResponse;
@Before
public void setUp() {
restTemplate = new RestTemplate();
headers = new HttpHeaders();
headers.set("requester", "test");
headers.set("Authorization", "Token KqY+VEP3A/Cj");
@Test
public void testPost() {
getHeaders().setContentType(MediaType.APPLICATION_XML);
setHttpEntity(new HttpEntity(getHeaders() ));
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("file", new FileSystemResource("C:\\Users\\dt208672\\Desktop\\2104000573.SIM2015060000000000.STMT.980061281_52.xml"));
try {
getRestTemplate().exchange("https://test.com/documents", HttpMethod.POST, new HttpEntity<MultiValueMap<String, Object>>(map, getHeaders()), String.class);
}catch(HttpClientErrorException e) {
fail("Document not found! Status code " + e.getStatusCode());
}
}
}
2016年3月16日太平洋标准时间晚上9:20编辑:
实际上,终点是这个。这是否意味着我必须改变方法?我可能希望避免更改方法中的任何代码
@RequestMapping(value = "/documents", method = RequestMethod.POST, produces = {
MediaType.APPLICATION_XML_VALUE, AppConstant.APPLICATION_PDF })
@ResponseStatus(HttpStatus.CREATED)
@AuditEventAccess(auditEventAccessSuccess = AppConstant.AUDIT_EVENT_CLASFN_ID_POST_REALTIME_DOCUMENT_SUCCESSFUL, auditEventAccessError = AppConstant.AUDIT_EVENT_CLASFN_ID_POST_REALTIME_DOCUMENT_FAILED)
public <T> T postRealTimeDocument(final HttpServletRequest request) {
@RequestMapping(value=“/documents”,method=RequestMethod.POST,products={
MediaType.APPLICATION\u XML\u值,AppConstant.APPLICATION\u PDF})
@ResponseStatus(HttpStatus.CREATED)
@AuditEventAccess(auditEventAccessSuccess=AppConstant.AUDIT\u EVENT\u CLASFN\u ID\u POST\u REALTIME\u DOCUMENT\u成功,auditEventAccessError=AppConstant.AUDIT\u EVENT\u CLASFN\u ID\u POST\u REALTIME\u DOCUMENT\u失败)
公共T postRealTimeDocument(最终HttpServletRequest请求){
问题在于您发布的是一个文件,而不是xml格式的字符串。因此,您应该以多部分/表单数据的形式进行调用
在实践中,您的方法应该如下所示
public class BaseTest {
// as your test
....
@Test
public void testPost() {
getHeaders().setContentType(MediaType.MULTIPART_FORM_DATA);
setHttpEntity(new HttpEntity(getHeaders() ));
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("file", new FileSystemResource("C:\\Users\\dt208672\\Desktop\\2104000573.SIM2015060000000000.STMT.980061281_52.xml"));
try {
getRestTemplate().exchange("https://test.com/documents", HttpMethod.POST, new HttpEntity<MultiValueMap<String, Object>>(map, getHeaders()), String.class);
}catch(HttpClientErrorException e) {
fail("Document not found! Status code " + e.getStatusCode());
}
}
}
或者使用Servlet3抽象
@RequestMapping(value = "/documents", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity saveDocument(@RequestParam("file") Part file){
...
}
或者使用dto方法
@RequestMapping(value = "/documents", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity saveSocument(@ModelAttribute("file") FileDTO file){
...
}
@Data
class FileDTO {
private MultipartFile file;
// eventualy other proeprties
....
}
即使您使用标准的MultipartFile Spring抽象,Servlet 3部分抽象,也要使用类似FileDTO的dto,关键点是:使用multipart/form数据作为消费者媒体类型,使用Apache commons fileupload或Servlet 3环境
我希望tihi能够帮助您正如错误消息所说,
没有找到适合请求类型[org.springframework.util.LinkedMultiValueMap]的合适的HttpMessageConverter
,Spring不知道如何将映射对象转换为字符串以进行传输。您可能需要将文件内容读入可序列化对象,然后将其作为消息正文发送。消息正文是否能够反序列化序列化该序列化对象?我收到了一个400错误的请求,而不是OK我不知道您的ndpoint是编写的,但我希望有这样的想法:@RequestMapping(value=“/documents”,method=RequestMethod.POST,consumes=“multipart/form data”)public ResponseEntity saveDocument(@RequestParam(“file”)MultipartFile file)实际上端点有点不同。不确定这是否会改变什么。更新了问题
@RequestMapping(value = "/documents", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity saveDocument(@RequestParam("file") Part file){
...
}
@RequestMapping(value = "/documents", method = RequestMethod.POST, consumes = "multipart/form-data")
public ResponseEntity saveSocument(@ModelAttribute("file") FileDTO file){
...
}
@Data
class FileDTO {
private MultipartFile file;
// eventualy other proeprties
....
}