Я пытаюсь установить собственный заголовок для своих запросов RestTemplate. Я использую Spring Boot 2.0.6.RELEASE
Я пытаюсь установить их так, внутри моего общедоступного метода
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("muh Header", "muh value");
Каждый раз, когда я пытаюсь это сделать, возникает следующая ошибка
'HttpHeaders(java.util.Map<java.lang.String,java.util.List<java.lang.String>>)' has private access in 'java.net.http.
Я понимаю, что сообщение об ошибке означает, что я пытаюсь создать экземпляр частного класса вне класса, в котором объявлен частный класс.
Итак, каков наилучший курс действий?




Вы можете создать перехватчик, который перехватывает все запросы, отправленные остальным шаблоном, и добавлять настраиваемые заголовки следующим образом:
public class TokenAuthorizationInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
request.getHeaders().add("ContentType", MediaType.APPLICATION_JSON);
request.getHeaders().add("muh Header", "muh value");
return execution.execute(request, body);
}
}
this.restTemplate = new RestTemplate();
this.restTemplate.getInterceptors().add(new TokenAuthorizationInterceptor());
Это будет работать нормально, если вы хотите добавить одинаковые пользовательские заголовки ко всем вашим запросам, отправляемым через этот шаблон отдыха. Одним из преимуществ этого подхода является то, что вы можете устанавливать собственные HTTP-заголовки только в одном месте, а не делать это везде, где вы отправляете запрос.
Я бы сказал что-то вроде этого:
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebController {
private static final String template = "Hello, %s!";
@RequestMapping("/greeting")
public ResponseEntity<String> greeting(@RequestParam(value = "name", defaultValue = "World") String name){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("thisiskey", "this is value");
return new ResponseEntity<>(name, headers, HttpStatus.ACCEPTED);
}
}
Надо задуматься:
Как часто вы хотите добавлять собственный заголовок и как часто они меняются? Если это применимо только к одному или двум, вы можете рассмотреть этот вариант, однако, если он более чем в два раза, я бы предложил использовать http-перехватчик.
header.add ("", "") ->, который реализует MultiValueMap, не принимает header.add ("mua key", "...") ->, поскольку в ключе есть пробел.
Пакет, который вы используете, неправильный, чтобы добавить заголовки при использовании Spring restTemplate, вы должны использовать org.springframework.http.HttpHeaders.HttpHeaders вместо java.net.http.HttpHeaders, последний - это то, что вы пытаетесь использовать.
Вот фрагмент кода, который добавляет заголовки запроса.
// request resource
HttpHeaders headers = new HttpHeaders();
headers.set("headerName", "headerValue");
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<String> response = restTemplate.exchange("some url", HttpMethod.GET, entity, String.class);
Это тоже было проблемой, очень раздражало, ха.
задается аналогичный вопрос stackoverflow.com/questions/45152484/…, однако я проверил и выяснил, что они используют тот же подход, что и вы.