Почему моя модификация SOAP не работает после перехода с CXF 3.5.7 на 4.1.0? Получение cl — это нулевая ошибкаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему моя модификация SOAP не работает после перехода с CXF 3.5.7 на 4.1.0? Получение cl — это нулевая ошибка

Сообщение Anonymous »

В настоящее время я переношу проект с Apache CXF версии 3.5.7 на версию 4.1.0, и после миграции моя логика изменения сообщений SOAP перестала работать. Ошибка, с которой я столкнулся, — это исключение cl is null. В предыдущей версии код работал нормально, но теперь объект cl кажется нулевым, и я не могу понять, почему.
Кто-нибудь сталкивался с этой проблемой при обновлении версий CXF? Какие изменения мне следует внести, чтобы моя модификация SOAP работала корректно в CXF 4.1.0? Будем признательны за любые идеи и предложения!

Код: Выделить всё

java.lang.NullPointerException: NullPointerException invoking http://test:4004/se/tm/cc: Cannot invoke "java.net.http.HttpClient.sendAsync(java.net.http.HttpRequest, java.net.http.HttpResponse$BodyHandler)" because "cl" is null at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1452) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1438) at org.apache.cxf.transport.http.HttpClientHTTPConduit$HttpClientWrappedOutputStream.close(HttpClientHTTPConduit.java:824) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:334) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:233) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:207) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:159) at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:224) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:312) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
Для кода:

Код: Выделить всё

`public class OutPreStreamInterceptor extends AbstractPhaseInterceptor{

public OutPreStreamInterceptor(String phase) {
super(phase);
addBefore(SoapPreProtocolOutInterceptor.class.getName());
}

@Override
public void handleMessage(Message message) {
OutputStream os = message.getContent(OutputStream.class);
boolean isOutbound = message == message.getExchange().getOutMessage()
|| message == message.getExchange().getOutFaultMessage();

String content = getRawContent(message);
String newContent = content;
if (isOutbound) {

InterceptorUtils.CachedStream cs = new InterceptorUtils.CachedStream();
message.setContent(OutputStream.class, cs);
String action = retrieveSOAPAction(message);
if (action.contains("test") ) {
newContent = content.replace("tt", "");
}
if (action.contains("test2")) {
newContent = changeJobId(newContent);
}
if (!StringUtils.equalsIgnoreCase(newContent, content)) {
log.debug("0;Outbound message has been changed: " + newContent);
}
try {
replaceContent(message, newContent, os);
} catch (IOException e) {
log.error("0;Error while replacing outbound message {}", e.getMessage());
throw new RuntimeException("Error while replacing outbound message"  + e);
}
} else {
// If necessary, in-bound message may be changed here.
}
}

public static void replaceContent(Message message, String newContent, OutputStream os) throws IOException {
InputStream replaceInStream = new ByteArrayInputStream(newContent.getBytes(StandardCharsets.UTF_8));

IOUtils.copy(replaceInStream, os);
replaceInStream.close();

os.flush();
message.setContent(OutputStream.class, os);
os.close();
}`
Я пытался проверить внутренние классы и изменения, но безуспешно.
Но если удалить этот пользовательский перехватчик, код будет работать нормально.

Подробнее здесь: https://stackoverflow.com/questions/793 ... 7-to-4-1-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»