java.lang.classnotfoundexception:com.sun.xml.internal.bind.v2.contextfactory

9bfwbjaz  于 2021-07-18  发布在  Java
关注(0)|答案(1)|浏览(772)

spring boot版本2.4.4
java版本15

@Bean
    public WebClient webClient() {
        return WebClient.builder().baseUrl(BASE_URL)
                .defaultHeaders(header -> header.setBasicAuth("test",
                        "testpwd"))
                .clientConnector(new ReactorClientHttpConnector(HttpClient.newConnection()))
                .exchangeStrategies(ExchangeStrategies.builder().codecs(configurer -> {
                    configurer.defaultCodecs().jaxb2Encoder(new Jaxb2XmlEncoder());
                    configurer.defaultCodecs().jaxb2Decoder(new Jaxb2XmlDecoder());
                }).build()).build();

    }

使用springboot2.4.4webclient并尝试使用带有xml响应的服务。

public Mono<ServerResponse> retrieveServices() {

        // Headers can be passed here or while building the client
        Mono<DirectoryOfService> serviceMono = webClient
             .get().uri("/api/v1/test/services")
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
            .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
            .retrieve().bodyToMono(DirectoryOfService.class);

    }

error:-

org.springframework.core.codec.CodecException: Could not create JAXBContext for class [class com.test.model.DirectoryOfService]: Implementation of JAXB-API has not been found on module path or classpath.; nested exception is javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at org.springframework.http.codec.xml.JaxbContextContainer.lambda$getJaxbContext$0(JaxbContextContainer.java:58) ~[spring-web-5.3.5.jar:5.3.5]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ Body from GET https://test.com/api/v1/services [DefaultClientResponse]
    |_ checkpoint ⇢ HTTP GET "/api/v1/services" [ExceptionHandlingWebHandler]
Stack trace:
        at org.springframework.http.codec.xml.JaxbContextContainer.lambda$getJaxbContext$0(JaxbContextContainer.java:58) ~[spring-web-5.3.5.jar:5.3.5]
        at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na]
        at org.springframework.http.codec.xml.JaxbContextContainer.getJaxbContext(JaxbContextContainer.java:52) ~[spring-web-5.3.5.jar:5.3.5]
        at org.springframework.http.codec.xml.JaxbContextContainer.createUnmarshaller(JaxbContextContainer.java:47) ~[spring-web-5.3.5.jar:5.3.5]
        at org.springframework.http.codec.xml.Jaxb2XmlDecoder.initUnmarshaller(Jaxb2XmlDecoder.java:235) ~[spring-web-5.3.5.jar:5.3.5]
        at org.springframework.http.codec.xml.Jaxb2XmlDecoder.unmarshal(Jaxb2XmlDecoder.java:216) ~[spring-web-5.3.5.jar:5.3.5]
        at org.springframework.http.codec.xml.Jaxb2XmlDecoder.decode(Jaxb2XmlDecoder.java:195) ~[spring-web-5.3.5.jar:5.3.5]
        at org.springframework.http.codec.xml.Jaxb2XmlDecoder.lambda$decodeToMono$2(Jaxb2XmlDecoder.java:183) ~[spring-web-5.3.5.jar:5.3.5]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:295) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1815) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:259) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142) ~[reactor-core-3.4.4.jar:3.4.4]
        at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:401) ~[reactor-netty-core-1.0.5.jar:1.0.5]
        at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:416) ~[reactor-netty-core-1.0.5.jar:1.0.5]
        at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:470) ~[reactor-netty-core-1.0.5.jar:1.0.5]
        at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:685) ~[reactor-netty-http-1.0.5.jar:1.0.5]
        at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:94) ~[reactor-netty-core-1.0.5.jar:1.0.5]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1534) ~[netty-handler-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1283) ~[netty-handler-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1330) ~[netty-handler-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:508) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.60.Final.jar:4.1.60.Final]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.60.Final.jar:4.1.60.Final]
        at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) ~[jaxb-api-2.3.1.jar:2.3.0]
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[jaxb-api-2.3.1.jar:2.3.0]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.1.jar:2.3.0]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.1.jar:2.3.0]
    at org.springframework.http.codec.xml.JaxbContextContainer.lambda$getJaxbContext$0(JaxbContextContainer.java:54) ~[spring-web-5.3.5.jar:5.3.5]
    at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na]
    at org.springframework.http.codec.xml.JaxbContextContainer.getJaxbContext(JaxbContextContainer.java:52) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.http.codec.xml.JaxbContextContainer.createUnmarshaller(JaxbContextContainer.java:47) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.http.codec.xml.Jaxb2XmlDecoder.initUnmarshaller(Jaxb2XmlDecoder.java:235) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.http.codec.xml.Jaxb2XmlDecoder.unmarshal(Jaxb2XmlDecoder.java:216) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.http.codec.xml.Jaxb2XmlDecoder.decode(Jaxb2XmlDecoder.java:195) ~[spring-web-5.3.5.jar:5.3.5]
    at org.springframework.http.codec.xml.Jaxb2XmlDecoder.lambda$decodeToMono$2(Jaxb2XmlDecoder.java:183) ~[spring-web-5.3.5.jar:5.3.5]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:295) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1815) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:259) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:142) ~[reactor-core-3.4.4.jar:3.4.4]
    at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:401) ~[reactor-netty-core-1.0.5.jar:1.0.5]
    at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:416) ~[reactor-netty-core-1.0.5.jar:1.0.5]
    at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:470) ~[reactor-netty-core-1.0.5.jar:1.0.5]
    at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:685) ~[reactor-netty-http-1.0.5.jar:1.0.5]
    at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:94) ~[reactor-netty-core-1.0.5.jar:1.0.5]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-codec-4.1.60.Final.jar:4.1.60.Final]
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.60.Final.jar:4.1.60.Final]

格雷德尔先生,

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '3.0.0'
    implementation group: 'com.sun.xml.bind', name: 'jaxb-core', version: '3.0.0'
    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'

}

删除com.sun.xml.bind并添加glassfish后,出现以下错误。
实现“org.glassfish”。jaxb:jaxb-runtime:2.3.1'
错误:

org.springframework.core.codec.CodecException: Could not create JAXBContext for class [class com.test.model.DirectoryOfService]: 10 counts of IllegalAnnotationExceptions; nested exception is com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 10 counts of IllegalAnnotationExceptions
Class has two properties of the same name "section"
    this problem is related to the following location:
        at public com.test.model.Section com.test.model.DirectoryOfService.getSection()
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "name"
    this problem is related to the following location:
        at public java.lang.String com.test.model.Section.getName()
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.lang.String com.test.model.Section.name
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "test"
    this problem is related to the following location:
        at public java.util.List com.test.model.Section.getTest()
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "code"
    this problem is related to the following location:
        at public java.lang.String com.test.model.Test.getCode()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.lang.String com.test.model.Test.code
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "currency"
    this problem is related to the following location:
        at public java.lang.String com.test.model.Test.getCurrency()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.lang.String com.test.model.Test.currency
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "includes"
    this problem is related to the following location:
        at public java.lang.String com.test.model.Test.getIncludes()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.lang.String com.test.model.Test.includes
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "name"
    this problem is related to the following location:
        at public java.lang.String com.test.model.Test.getName()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.lang.String com.test.model.Test.name
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "nonDiscountable"
    this problem is related to the following location:
        at public boolean com.test.model.Test.isNonDiscountable()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private boolean com.test.model.Test.nonDiscountable
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "replicate"
    this problem is related to the following location:
        at public int com.test.model.Test.getReplicate()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private int com.test.model.Test.replicate
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
Class has two properties of the same name "validFrom"
    this problem is related to the following location:
        at public java.util.Date com.test.model.Test.getValidFrom()
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService
    this problem is related to the following location:
        at private java.util.Date com.test.model.Test.validFrom
        at com.test.model.Test
        at private java.util.List com.test.model.Section.test
        at com.test.model.Section
        at private com.test.model.Section com.test.model.DirectoryOfService.section
        at com.test.model.DirectoryOfService

样本响应文件,

<?xml version='1.0' encoding='UTF-8'?>
<DirectoryOfService>
    <Section Name="Directory">
        <Test>
            <Name>Mike</Name>
            <Code>USA</Code>
            <Replicate>0</Replicate>
            <ValidFrom>2016-06-30</ValidFrom>
            <Includes>Test Includes</Includes>
            <Currency>None</Currency>
            <NonDiscountable>false</NonDiscountable>
        </Test>
        <Test>
            <Name>Bingo</Name>
            <Code>USA</Code>
            <Replicate>0</Replicate>
            <ValidFrom>2016-06-30</ValidFrom>
            <Includes>Test Includes</Includes>
            <Currency>None</Currency>
            <NonDiscountable>false</NonDiscountable>
        </Test>
    </Section>
</DirectoryOfService>

模型类,
服务类目录,

import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="DirectoryOfService")
public class DirectoryOfService {

    @XmlElementRef(name = "Section")
    private Section section;

    public Section getSection() {
        return section;
    }

    public void setSection(Section section) {
        this.section = section;
    }

}

截面计算,

@XmlRootElement(name="Section")
    public class Section {

        @XmlElementRef(name = "Test")
        private List<Test> test;
        @XmlAttribute(name = "Name")
        private String name;
        //public String text;

        public List<Test> getTest() {
            return test;
        }

        public void setTest(List<Test> test) {
            this.test = test;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

Test class,

@XmlRootElement(name = "Test")
public class Test {

    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "Code")
    private String code;
    @XmlElement(name = "Replicate")
    private int replicate;
    @XmlElement(name = "ValidFrom")
    private Date validFrom;
    @XmlElement(name = "Includes")
    private String includes;
    @XmlElement(name = "Currency")
    private String currency;
    @XmlElement(name = "NonDiscountable")
    private boolean nonDiscountable;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getReplicate() {
        return replicate;
    }

    public void setReplicate(int replicate) {
        this.replicate = replicate;
    }

    public Date getValidFrom() {
        return validFrom;
    }

    public void setValidFrom(Date validFrom) {
        this.validFrom = validFrom;
    }

    public String getIncludes() {
        return includes;
    }

    public void setIncludes(String includes) {
        this.includes = includes;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }

    public boolean isNonDiscountable() {
        return nonDiscountable;
    }

    public void setNonDiscountable(boolean nonDiscountable) {
        this.nonDiscountable = nonDiscountable;
    }

}
o3imoua4

o3imoua41#

尽管您测试了类似的方法,但请考虑回顾一下github的问题,尤其是最后的评论,我认为这会有所帮助。
也要确保有适当版本的jaxb运行时。在以前的问题中,spring似乎无法在类路径中找到合适的jaxb实现。对于 jaxb-api 你在相依关系中指出的, 2.3.1 ,请删除与相关的依赖项 com.sun.xml.bind 包括以下内容:

implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1'

最近的
org.glassfish.jaxb jaxb-runtime 比如说,版本 3.0.0 ,取决于
org.glassfish.jaxb jaxb-core 这又取决于
jakarta.xml.bind jakarta.xml.bind-api 基于java的Eclipse基金会JAXB实现。如果你想用 org.glassfish.jaxb:jaxb-runtime:3.0.0 包括以下依赖项:

implementation group: 'jakarta.xml.bind', name: 'jakarta.xml.bind-api', version: '3.0.0'

而不是之前定义的jaxb api:

implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'

因此,请更改您的进口并仔细测试,我从未用Spring测试过 WebClient 以及相关的jaxb编解码器。
关于 section 重复,jaxb似乎试图序列化pojo的字段和方法定义的属性。要避免此问题,请使用 @XmlAccessorType 注解。例如:

@XmlRootElement(name="DirectoryOfService")
@XmlAccessorType(XmlAccessType.FIELD)
public class DirectoryOfService {

    @XmlElementRef(name = "Section")
    private Section section;

    public Section getSection() {
        return section;
    }

    public void setSection(Section section) {
        this.section = section;
    }

}
@XmlRootElement(name="Section")
@XmlAccessorType(XmlAccessType.FIELD)
public class Section {

    @XmlElementRef(name = "Test")
    private List<Test> test;
    @XmlAttribute(name = "Name")
    private String name;
    //public String text;

    public List<Test> getTest() {
        return test;
    }

    public void setTest(List<Test> test) {
        this.test = test;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
@XmlRootElement(name = "Test")
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {

    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "Code")
    private String code;
    @XmlElement(name = "Replicate")
    private int replicate;
    @XmlElement(name = "ValidFrom")
    private Date validFrom;
    @XmlElement(name = "Includes")
    private String includes;
    @XmlElement(name = "Currency")
    private String currency;
    @XmlElement(name = "NonDiscountable")
    private boolean nonDiscountable;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getReplicate() {
        return replicate;
    }

    public void setReplicate(int replicate) {
        this.replicate = replicate;
    }

    public Date getValidFrom() {
        return validFrom;
    }

    public void setValidFrom(Date validFrom) {
        this.validFrom = validFrom;
    }

    public String getIncludes() {
        return includes;
    }

    public void setIncludes(String includes) {
        this.includes = includes;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }

    public boolean isNonDiscountable() {
        return nonDiscountable;
    }

    public void setNonDiscountable(boolean nonDiscountable) {
        this.nonDiscountable = nonDiscountable;
    }

}

相关问题