Создать динамический c PDF в SOAP Ответ в Spring Boot - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть проект Spring Boot, и мне нужно создать динамический c pdf в виде SOAP вложенного ответа, используя base64Binary, который будет добавлен в ответ.

В xsd у меня есть:

 <xs:complexType name="profile">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="content" type="xs:base64Binary" xmime:expectedContentTypes="application/pdf"/>
        </xs:sequence>
    </xs:complexType>

, который устанавливает атрибут содержимого в профиле как держатель PDF

В настоящее время я могу отправить stati c PDF в качестве ответа, используя MTOM , Мое требование - создать динамическое вложение c pdf ias SOAP, используя поле base64Binary, которое будет отображаться в ответе SOAP.

Пожалуйста, найдите код ниже. Любая помощь будет приветствоваться.

SOAPConfig

@EnableWs
@Configuration
public class SOAPConfig extends WsConfigurationSupport {

    //having WSDL only
    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext); // applicationContext  to find other beans 
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/ws/*");  // http://localhost:9090/ws/
    }

    @Bean(name="users") // bean name = wsdl name  // http://localhost:9090/ws/users.wsdl
    public Wsdl11Definition defaultWsdl11Definition() {
        SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
        wsdl11Definition.setWsdl(new ClassPathResource("/users.wsdl"));

        return wsdl11Definition;
    }

     @Bean
     public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.demo.spring.boot.soap.mtomresponse.models.user");
        marshaller.setMtomEnabled(true); // IMPORTANT
        return marshaller;
     }

    @Bean
    @Override
    public DefaultMethodEndpointAdapter defaultMethodEndpointAdapter() {
        List<MethodArgumentResolver> argumentResolvers = new ArrayList<>();
        argumentResolvers.add(methodProcessor());
        List<MethodReturnValueHandler> returnValueHandlers = new ArrayList<MethodReturnValueHandler>();
        returnValueHandlers.add(methodProcessor());
        DefaultMethodEndpointAdapter adapter = new DefaultMethodEndpointAdapter();
        adapter.setMethodArgumentResolvers(argumentResolvers);
        adapter.setMethodReturnValueHandlers(returnValueHandlers);
        return adapter;
    }

    @Bean
    public MarshallingPayloadMethodProcessor methodProcessor() {
        return new MarshallingPayloadMethodProcessor(marshaller());
    }

}

SOAPEndpoint

@Endpoint
public class SOAPEndpoint {

    private static final String NAMESPACE_URI = "http://demo.com/spring/boot/soap/mtomresponse/models/user";

    private UserRepository userRepository;

    @Autowired
    public SOAPEndpoint(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getUserRequest")
    @ResponsePayload
    public GetUserResponse getUser(@RequestPayload GetUserRequest request) {
        GetUserResponse response = new GetUserResponse();
        response.setUser(userRepository.getUserById(request.getId()));

        return response;
    }
}

Репозиторий

 @PostConstruct
    public void init() {
        User user = new User();
        Profile profile = new Profile();
        user.setId(1);
        user.setFirstname("Test");
        user.setLastname("User");
        try {
            profile.setName(user.getId() + "_" + user.getFirstname());

            //set static pdf as attachment in SOAP response  - Working
            //File filePath = new File("C:/Softwares/test.pdf");
            //profile.setContent(new DataHandler(new FileDataSource(filePath)));

            //set dynamic pdf as attachment in SOAP response - Not Working
            String bas64BinaryString = "SGVsbG8gV29ybGQsIFNPQVAgcmVzcG9uc2UgUERG";
            byte[] bArr = Base64.getDecoder().decode(bas64BinaryString);
            File file = new File("C:/Softwares/testDynamic.pdf");
            OutputStream os = new FileOutputStream(file); 
            os.write(bArr,0,bArr.length); 
            profile.setContent(new DataHandler(new FileDataSource(file)));

            user.setProfile(profile);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

Ошибка : Невозможно открыть вложение в формате PDF, говоря, что это не поддерживаемый тип файла ИЛИ файл поврежден. Также я хочу PDF только во вложении, а не как скачанный.

Пожалуйста, помогите.

...