How to resolve -- /var/lib/nginx/tmp/ Permission Denied Error
Recently I have encountered this error. Problem is that: user that runs nginx service has no permission to access /var/lib/nginx/tmp file. Example: …
Jackson is a popular Java library for working with JSON. Even it is easy to use, when converting a JSON string to a generic Java class, such as ApiGenericResponse<T>
, you may run into an issue where the response object is of type LinkedHashMap
instead of the expected type T
.
Let’s say you have the following classes in your Java project:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiGenericResponse<T> {
private T response;
private boolean success;
private int httpStatusCode;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DummyResponse {
private String name;
private String surname;
}
And you have the following static method to convert response to your ApiGenericResponse:
public class App {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static <T> ApiGenericResponse<T> readJsonAs(String json) throws Exception{
return objectMapper.readValue(json, new TypeReference<ApiGenericResponse<T>>() {});
}
public static void main( String[] args ) {
String json = "{\"response\":{\"name\":\"test\",\"surname\":\"test\"},\"success\":true,\"httpStatusCode\":200,\"success\":true}";
ApiGenericResponse<DummyResponse> response = readJsonAs(json);
System.out.println(response.getResponse().getName());
}
}
If you run this method, you will get a ClassCastException with the error message: class java.util.LinkedHashMap cannot be cast to class org.example.DummyResponse. This is because Jackson can’t determine the exact object inside ApiGenericResponse and returns a LinkedHashMap instead.
Exception in thread "main" java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.example.DummyResponse (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; org.example.DummyResponse is in unnamed module of loader 'app')
at org.example.App.main(App.java:31)
You can easily solve this problem by modifying the readJsonAs
:
public class App {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static <T> ApiGenericResponse<T> readJsonAs(String json, Class<T> responseType) throws Exception {
// Create a TypeReference object that represents the type ApiGenericResponse<T>
TypeReference<ApiGenericResponse<T>> typeReference = new TypeReference<ApiGenericResponse<T>>() {};
// Deserialize the JSON string into an instance of ApiGenericResponse<T>
ApiGenericResponse<T> apiResponse = objectMapper.readValue(json, typeReference);
// Get the actual response object from the response field, and convert it to the specified type
T response = objectMapper.convertValue(apiResponse.getResponse(), responseType);
// Set the actual response object to the response field
apiResponse.setResponse(response);
return apiResponse;
}
public static void main( String[] args ) throws Exception {
DummyResponse dummyResponse = DummyResponse.builder().name("test").surname("test").build();
ApiGenericResponse<DummyResponse> test = ApiGenericResponse.<DummyResponse>builder()
.httpStatusCode(200)
.success(true)
.response(dummyResponse)
.build();
System.out.println(objectMapper.writeValueAsString(test));
String json = "{\"response\":{\"name\":\"test\",\"surname\":\"test\"},\"success\":true,\"httpStatusCode\":200,\"success\":true}";
ApiGenericResponse<DummyResponse> response = readJsonAs(json, DummyResponse.class);
System.out.println(response.getResponse().getName());
}
}
The only difference is that we are providing information about the expected type into Jackson. I believe comments are self-explanatory.
Recently I have encountered this error. Problem is that: user that runs nginx service has no permission to access /var/lib/nginx/tmp file. Example: …
This error might releted to your Nginx configuration(at least problem was the nginx for me) After enable the SSL connection and try to connect from …