У меня есть проект 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 только во вложении, а не как скачанный.
Пожалуйста, помогите.