Java 带有rootUri的Spring RestTemplate返回URI不是绝对错误

Java 带有rootUri的Spring RestTemplate返回URI不是绝对错误,java,spring,kubernetes,resttemplate,camunda,Java,Spring,Kubernetes,Resttemplate,Camunda,我有一个restemplate,我用restemplatebuilder构建它。我为生成器设置了rootUri。在下面的方法(updateState1)中,有时会出现“URI不是绝对的”错误。例如,当我同时调用这个方法两次时,我经常得到一个错误 编辑和解决方案: 我在camunda流程的服务任务中使用此RestTemplate。我在kubernetes容器中启动这个项目,该容器和oracle数据库具有不同的时区。当我添加时区变量时,一切正常 Spring启动版本:2.1.1.0版本 这是我的密码

我有一个
restemplate
,我用
restemplatebuilder
构建它。我为生成器设置了rootUri。在下面的方法(updateState1)中,有时会出现“URI不是绝对的”错误。例如,当我同时调用这个方法两次时,我经常得到一个错误

编辑和解决方案: 我在camunda流程的服务任务中使用此
RestTemplate
。我在kubernetes容器中启动这个项目,该容器和oracle数据库具有不同的时区。当我添加时区变量时,一切正常

Spring启动版本:2.1.1.0版本

这是我的密码:

@Component
@Slf4j
public class CoreServiceClient {

    private RestTemplate restTemplate;

    private static final String root = "http://localhost:8080/test/api/";

    public CoreServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.rootUri(root).build();
    }


    public void updateState1(UpdateParam updateParam) {
        HttpHeaders headers = generateHeader();
        UpdateRequest updateRequest = new UpdateRequest(updateParam.getState());

        HttpEntity<UpdateRequest> httpEntity = new HttpEntity<>(updateRequest, headers);

        ResponseEntity<String> response = restTemplate.exchange(
                "/food/{id}/state",
                HttpMethod.PUT, httpEntity, String.class, updateParam.getId());

    }
    public void updateState2(String id) {
        HttpHeaders headers = generateHeader();
        UpdateRequest updateRequest = new UpdateRequest("done");

        HttpEntity<UpdateRequest> httpEntity = new HttpEntity<>(updateRequest, headers);

        ResponseEntity<String> response = restTemplate.exchange(
                "/food/{id}/state",
                HttpMethod.PUT, httpEntity, String.class, id);

    }
}

在根目录中删除
/

private static final String root = "http://localhost:8080/test/api";

RestTemplate接受uriTemplate,只要它们以
/
开头,那么您的根目录就应该没有uriTemplate。如果它不是从<代码> /<代码>开始的,它会认为它是一个完整的代码> URL< /COD> < /P> < P>我用相同的代码尝试。我不明白这个错误。 Spring启动版本:
1.5.0.发布

我尝试使用具有相同URL模式的GETAPI而不是POST。 路径末尾的
/
无关紧要

@Component
public class CoreServiceClient {
    private RestTemplate restTemplate;

    private static final Logger LOGGER = LoggerFactory.getLogger(CoreServiceClient.class);
    private static final String root = "http://localhost:8080/test/api/";

    public CoreServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.rootUri(root).build();
    }


    public void updateState(String id) {

        try {
            ResponseEntity<String> response =
                    restTemplate.exchange("/food/{id}/state", HttpMethod.GET, null, String.class, id);
            LOGGER.info("Resp: {}", response.getStatusCode());
            LOGGER.info("Resp: {}", response.getBody());
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }


    }
}

调用
restemplate.exchange
时,您的最终URL是什么?我想调用“{id}/state”,但出现了错误。我添加了原因例外。stacktrace中没有任何URL。您有时指的是什么?例如,当我同时运行它两次时,第一次运行没有错误,但第二次运行有错误。有时一切都很好,有时两个电话都有错误。
@Component
public class CoreServiceClient {
    private RestTemplate restTemplate;

    private static final Logger LOGGER = LoggerFactory.getLogger(CoreServiceClient.class);
    private static final String root = "http://localhost:8080/test/api/";

    public CoreServiceClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.rootUri(root).build();
    }


    public void updateState(String id) {

        try {
            ResponseEntity<String> response =
                    restTemplate.exchange("/food/{id}/state", HttpMethod.GET, null, String.class, id);
            LOGGER.info("Resp: {}", response.getStatusCode());
            LOGGER.info("Resp: {}", response.getBody());
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }


    }
}
@RestController
@RequestMapping("/test/api")
public class FooController {

    @GetMapping("/food/{id}/state")
    public ResponseEntity<String> fooState(@PathVariable String id) {
        return new ResponseEntity<String>("EATING", HttpStatus.OK);
    }
}
@RestController
@RequestMapping("/client")
public class CoreServiceClientController {

    @Autowired
    private CoreServiceClient client;

    @GetMapping
    public ResponseEntity<String> goGet() {
        client.updateState("1001");
        return new ResponseEntity<>("HELLO", HttpStatus.OK);
    }
}
2019-01-15 23:23:19.870  INFO 22570 --- [nio-8080-exec-1] com.example.demo001.CoreServiceClient    : Resp: 200
2019-01-15 23:23:19.871  INFO 22570 --- [nio-8080-exec-1] com.example.demo001.CoreServiceClient    : Resp: EATING