Java 过帐文件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

我正试图通过rest调用发布文件。我要发布的文件是一个xml文件。出于授权目的,我还需要在标题中包含数据。通过一些挖掘,看起来我应该将这些头和文件放入一个映射中,该映射可以传递给rest模板的交换方法。这是我的源代码

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

    ....
}