0

Je suis bloqué ... L'application lit les fichiers * .json d'un répertoire, les convertit en objets de classe MyObject. Si la classe a un type "PEN", elle sera sauvegardée en tant qu'objet.Comment résoudre "type de charge utile de message non pris en charge"

TypeObjet est ENUM:

public enum ObjType { 
    FOOD, PEN, DRINK 
} 

J'ai la classe suivante:

public static void main(String[] args) throws Exception{ 
    SpringApplication.run(DemoApplication.class, args); 
} 

@Bean 
public IntegrationFlow fileReading() { 
    return IntegrationFlows 
      .from(s -> s.file(new File(DIR)) 
        .patternFilter(FILE_END), 
        e -> e.poller(Pollers.fixedDelay(500))) 
      .transform(new JsonToObjectTransformer(MyObject.class), mth -> mth.async(true)) 
      .filter(MyObject.class, s -> 
         s.getType() != null 
         && s.getType().toString().length() > 0 
         && Arrays.toString(ObjType.values()).contains(s.getType().toString())) 
      .<MyObject, ObjType>route(MyObject::getType, mapping -> mapping 
        .ignoreSendFailures(true) 
        .defaultOutputToParentFlow() 
        .subFlowMapping(ObjType.FOOD, sf -> sf 
         .handle(p -> { 
          printMessage((MyObject)p.getPayload()); 
         })) 
        .subFlowMapping(ObjType.PEN, sf -> sf 
         .channel(mc->mc.executor(Executors.newCachedThreadPool())) 
         .enrichHeaders(h->h 
           .header(MessageHeaders.CONTENT_TYPE, MyObject.class) 
           .shouldSkipNulls(true)) 
         .handleWithAdapter(
          a -> a 
           .file(new File(SAVE_DIR)) 
           .autoCreateDirectory(true) 
           .deleteSourceFiles(true) 
           .fileNameGenerator(message -> { 
            MyObject mo = (MyObject)message.getPayload(); 
            String head = message.getHeaders().getId().toString(); 
            return head; 
           }) 
           .fileExistsMode(FileExistsMode.REPLACE) 
          , c->c.requiresReply(false) 
           .autoStartup(true) 
           .async(true) 
           .id("writeFile") 
          ) 
         ) 
        ) 
      .get(); 
} 

L'application ne sauvegarde pas des objets. Comment puis-je gérer un problème lié à un type de charge de message non pris en charge [l.h.site.MyObject] '. J'ai reçu l'erreur suivante:

2017-09-15 16:01:58.118 INFO 10116 --- [ask-scheduler-3] o.s.i.file.FileReadingMessageSource  : Created message: [GenericMessage [payload=c:\JsonInput\something - Copy - Copy.json, headers={id=519f3cfc-8088-fe92-7663-1f3ce6b5f3e7, timestamp=1505480518118}]] 
2017-09-15 16:01:58.118 ERROR 10116 --- [ool-13-thread-1] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessageHandlingException: failed to write Message payload to file; nested exception is java.lang.IllegalArgumentException: unsupported Message payload type [l.h.site.MyObject], failedMessage=GenericMessage [[email protected], headers={contentType=class l.h.site.MyObject, id=e9d37006-d970-f55a-3961-d5f614dc681f, timestamp=1505480518118}] 
at org.springframework.integration.file.FileWritingMessageHandler.handleRequestMessage(FileWritingMessageHandler.java:483) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:425) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:375) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:360) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:271) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:188) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.access$000(UnicastingDispatcher.java:53) 
at org.springframework.integration.dispatcher.UnicastingDispatcher$3.run(UnicastingDispatcher.java:129) 
at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.IllegalArgumentException: unsupported Message payload type [l.h.site.MyObject] 
at org.springframework.integration.file.FileWritingMessageHandler.handleRequestMessage(FileWritingMessageHandler.java:468) 
... 24 more 
+0

Ce que vous voulez dire n'est pas clair. vous ne voulez pas écrire un objet dans un fichier; l'adaptateur ne gère que les charges utiles simples. Exactement ce que vous voulez écrire dans le fichier? –

+0

Je veux sérialiser MyObject. J'ai ajouté la transformation de MyObject à byte []. Maintenant, ça fonctionne bien. .transform (Transformers.converter (c -> { essayer (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { \t \t \t \t \t \t \t \t \t essayer (ObjectOutputStream os = new ObjectOutputStream (bos)) { \t \t \t \t \t \t \t \t \t \t os.writeObject (c); \t \t \t \t \t \t \t \t \t} \t \t \t \t \t \t \t \t \t bos.toByteArray de retour(); \t \t \t \t \t \t \t \t} catch (IOException ex) { \t \t \t \t \t \t \t \t \t ex.printStackTrace(); \t \t \t \t \t \t \t \t} \t \t \t \t \t \t \t \t return null; \t \t \t \t \t \t \t})) –

+0

solution plus facile: .transform (Transformers.serializer()) –

Répondre

0

Caused by: java.lang.IllegalArgumentException: unsupported Message payload type [l.h.site.MyObject] at org.springframework.integration.file.FileWritingMessageHandler.handleRequestMessage(FileWritingMessageHandler.java:468)

En conséquence du code:

if (payload instanceof File) { 
       resultFile = handleFileMessage((File) payload, tempFile, resultFile); 
      } 
      else if (payload instanceof InputStream) { 
       resultFile = handleInputStreamMessage((InputStream) payload, originalFileFromHeader, tempFile, 
         resultFile); 
      } 
      else if (payload instanceof byte[]) { 
       resultFile = this.handleByteArrayMessage(
         (byte[]) payload, originalFileFromHeader, tempFile, resultFile); 
      } 
      else if (payload instanceof String) { 
       resultFile = this.handleStringMessage(
         (String) payload, originalFileFromHeader, tempFile, resultFile); 
      } 
      else { 
       throw new IllegalArgumentException(
         "unsupported Message payload type [" + payload.getClass().getName() + "]"); 
      } 

Donc, si vous allez écrire votre MyObject au fichier, vous devriez envisager de le convertir de manière appropriée. Et c'est exactement le paragraphe dans le Reference Manual.