পোষ্ট জেএসওএন 415 অসমর্থিত মিডিয়া টাইপ, স্প্রিং 3 এমভিসি সহ ব্যর্থ


171

আমি একটি সার্লেটে একটি পোস্ট অনুরোধ প্রেরণ করার চেষ্টা করছি। অনুরোধটি jQuery এর মাধ্যমে এইভাবে প্রেরণ করা হয়েছে:

var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);

যেখানে নতুনশ্রেণী রয়েছে

function newCategory(productCategory)
{
  $.postJSON("ajax/newproductcategory", productCategory, function(
      idProductCategory)
  {
    console.debug("Inserted: " + idProductCategory);
  });
}

এবং পোস্ট জেএসএন হচ্ছে

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

ফায়ারব্যাগের সাহায্যে আমি দেখতে পাচ্ছি যে জেএসএন সঠিকভাবে পাঠানো হয়েছে:

{"idProductCategory":1,"description":"Descrizione2"}

তবে আমি 415 অসমর্থিত মিডিয়া টাইপ পাই। স্প্রিং এমভিসি নিয়ন্ত্রকের স্বাক্ষর রয়েছে

    @RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
        @RequestBody ProductCategory productCategory)

কিছু দিন আগে এটি কাজ করে, এখন তা হয় না। প্রয়োজনে আরও কোড দেখাবো। ধন্যবাদ


কিছু দিন আগে আপনি কি পরিবর্তন করেছেন? এছাড়াও, var productCategory = { idProductCategory: 1, description: "Descrizione2" };পড়া আরও সংক্ষিপ্ত এবং সহজ হবে না ? স্প্রিংকে application/jsonবিশেষভাবে গ্রহণ করার জন্য আপনার কী বলা দরকার ? অন্য কথায়, এটি কি কোনও ফর্মের উপাত্ত প্রত্যাশা করবে?
ডেভ নিউটন

যেহেতু আমি এই প্রকল্পের অন্যান্য অংশে কাজ করছি এবং আজ আমি এই প্রতিরোধের বিষয়টি পেয়েছি found এই অংশে আমি কিছুই পরিবর্তন করিনি। হ্যাঁ, আমাকে এই পদ্ধতিটি ব্যবহার করতে হবে কারণ আমি কোনও ফর্ম থেকে ইনপুট পাচ্ছি।
gc5

না আপনি নন, আপনি এটি কোনও জেএসএন আজাক্স পোস্ট থেকে পেয়ে যাচ্ছেন, যা ফর্ম এনকোডড ডেটার মতো নয়।
ডেভ নিউটন

1
আপনি কি নিশ্চিত জ্যাকসন এখনও আপনার ক্লাসস্পটে উপলব্ধ?
টমাসজ নুরকিউইজ

1
আপনি যদি অ্যাপ্লিকেশন / জসনের পরিবর্তে পাঠ্য / জসন প্রেরণ করেন তবে
আপনিও

উত্তর:


249

আমি স্প্রিং @ রেসপন্সবডি এর সাথে এর আগেও এরকম হয়েছিলাম এবং অনুরোধটি সহ কোনও গ্রহণযোগ্য শিরোনাম প্রেরণ করা হয়নি বলেই হয়েছিল। শিরোনাম গ্রহণ করুন jQuery দিয়ে সেট করতে ব্যথা হতে পারে, তবে এটি আমার উত্সের পক্ষে কাজ করেছে

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    headers: { 
        'Accept': 'application/json',
        'Content-Type': 'application/json' 
    },
    'type': 'POST',
    'url': url,
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

অনুরোধে ক্লায়েন্টের কাছ থেকে ডেটা কী ফর্ম্যাটটি প্রেরণ করা হচ্ছে তা নির্ধারণ করতে কন্টেন্ট-টাইপ শিরোনাম @RequestBody দ্বারা ব্যবহৃত হয়। স্বীকৃতি শিরোনামটি @ রেসপন্সবডি দ্বারা প্রতিক্রিয়াতে ক্লায়েন্টের কাছে ডেটা ফেরত পাঠানোর ফর্ম্যাট নির্ধারণ করতে ব্যবহৃত হয়। এজন্য আপনার উভয় শিরোলেখের প্রয়োজন।


1
শিরোনাম: {...} এবং JSON.stringify (...) সর্বদা আমাকে ট্রিপ করুন।
টিম পেরি

1
কেন এটি আরও নথিভুক্ত নয় ধারণা নেই। এই সমস্যাটি আমাকে এত সময় নষ্ট করে দিয়েছে। আপনাকে অনেক ধন্যবাদ!
হুগো নাভা কোপ্প

আমি প্রত্যাশা করেছি স্প্রিং ডিফল্টরূপে ফর্ম ডেটা সমর্থন করে, তবে তা হয় না। সুতরাং, (এখন বরং পুরানো) সমাধানের জন্য ধন্যবাদ।
রিজকিট

আমি একজন পোস্টম্যানকে একটি অনুরোধ অনুরোধ করার জন্য ব্যবহার করছিলাম, কেবলমাত্র সামগ্রী-ধরণ যুক্ত করেছি: '' অ্যাপ্লিকেশন /
জেসসন

21

application/jsonসমস্যার সমাধান হিসাবে অনুরোধে সামগ্রী প্রকরণ যুক্ত করুন


18

আমারও অনুরূপ সমস্যা ছিল তবে আমি খুঁজে পেয়েছি সমস্যাটি হ'ল আমি @RequestBody এর সাথে মন্তব্য করা ডিটিওর জন্য একটি ডিফল্ট কনস্ট্রাক্টর সরবরাহ করতে অবহেলা করেছি।


একই জিনিস আমার ঘটেছে. আমার একই নামে 2 টি পদ্ধতি ছিল এবং 415 পাচ্ছিলাম Thanks ধন্যবাদ!
ড্যানিয়েল ভিলাস-বোস

12

আমি বিশ্বাস করি আমি ঠিক একই সমস্যা নিয়ে এসেছি। জেএসএন, জাভাস্ক্রিপ্ট এবং সার্ভারের সাথে অগণিত ঘন্টা লড়াইয়ের পরে আমি অপরাধীকে খুঁজে পেলাম: আমার ক্ষেত্রে ডিটিওতে আমার একটি ডেট অবজেক্ট ছিল, এই তারিখটি একটি স্ট্রিংতে রূপান্তরিত হয়েছিল যাতে আমরা এটির সাথে দর্শনটিতে প্রদর্শন করতে পারি ফর্ম্যাট: এইচ এইচ: মিমি।

জেএসওএন তথ্য যখন ফেরত পাঠানো হচ্ছিল, এই তারিখের স্ট্রিং অবজেক্টটি একটি সম্পূর্ণ ডেট অবজেক্টে ফিরে রূপান্তর করতে হয়েছিল, সুতরাং ডিটিওতে সেট করার জন্য আমাদেরও একটি পদ্ধতি প্রয়োজন method বড় বাট হ'ল ডিটিওতে একই নামের (ওভারলোড) আপনার কাছে দুটি পদ্ধতি থাকতে পারে না যদিও তাদের কাছে বিভিন্ন ধরণের প্যারামিটার (স্ট্রিং বনাম তারিখ) রয়েছে কারণ এটি আপনাকে 415 অসমর্থিত মিডিয়া টাইপ ত্রুটিটিও দেবে।

এটি ছিল আমার নিয়ামক পদ্ধতি

  @RequestMapping(value = "/alarmdownload/update", produces = "application/json", method = RequestMethod.POST)
  public @ResponseBody
  StatusResponse update(@RequestBody AlarmDownloadDTO[] rowList) {
    System.out.println("hola");
    return new StatusResponse();
  }

এটি আমার ডিটিওর উদাহরণ (আইডি গেট / সেট এবং প্রাক অ্যালার্ম পদ্ধতিগুলি সংক্ষিপ্তকরণের জন্য অন্তর্ভুক্ত নয়):

@JsonIgnoreProperties(ignoreUnknown = true)
public class AlarmDownloadDTO implements Serializable {

  private static final SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm");

  private String id;
  private Date preAlarm;

  public void setPreAlarm(Date date) { 
    this.preAlarm == date;
  }
  public void setPreAlarm(String date) {    
    try {
      this.preAlarm = formatHHmm.parse(date);
    } catch (ParseException e) {
      this.preAlarm = null;
    } catch (NullPointerException e){
      this.preAlarm = null;
    }
  }
}

সমস্ত কিছু কাজ করতে আপনাকে ডেট টাইপ প্যারামিটার সহ পদ্ধতিটি সরিয়ে ফেলতে হবে। এই ত্রুটিটি খুব হতাশাব্যঞ্জক। আশা করি এটি কারও ডিবাগিংয়ের কয়েক ঘন্টা বাঁচাতে পারে।


ধন্যবাদ - অথবা আপনি কেবলমাত্র সেটারগুলির একটির নাম পরিবর্তন করতে পারেন। আমার কাছে শিমের উভয় পদ্ধতি public void setParameters(List<Parameter> parameters)এবং public void setParameters(Parameter... parameters)পদ্ধতি ছিল , addParametersআমার জন্য সমস্যাটি সমাধান করার জন্য আধুনিক পরিবর্তন করা ।
কনর সোভেনসন

দেহটি এই সমস্যাটি নয় কি এই.প্রেম অ্যালার্ম == তারিখের তুলনায় তারিখটি?
মাইকেল

12

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছিলাম এবং এটিই আমি ঠিক করেছি,

সমস্যাটি জেএসএন থেকে জাভাতে রূপান্তর প্রক্রিয়াটির কারণে হয়েছে, রূপান্তরটি সঠিকভাবে হওয়ার জন্য আপনার সঠিক রান টাইম জ্যাকসন লাইব্রেরি থাকা দরকার।

নিম্নলিখিত জারগুলি যোগ করুন (নির্ভরতার মাধ্যমে বা ডাউনলোড এবং ক্লাসপাথে যুক্ত করে।

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>

এই সমস্যা ঠিক করা উচিত।

সম্পূর্ণ কোড:

function() {
  $.ajax({
    type: "POST",
    url: "saveUserDetails.do",
    data: JSON.stringify({
      name: "Gerry",
      ity: "Sydney"
    }),
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    success: function(data) {
      if (data.status == 'OK')
        alert('Person has been added');
      else
        alert('Failed adding person: ' + data.status + ', ' + data.errorMessage);
}

এবং নিয়ামক স্বাক্ষরটি দেখতে দেখতে:

@RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST)
public @ResponseBody Person addPerson( @RequestBody final  Person person) {

আশাকরি এটা সাহায্য করবে


শুধুমাত্র jackson-databindপ্রয়োজন।
অ্যালেক্স 78191

8

আমি স্প্রিং এমভিসি সহ স্প্রিং বুট সংহত করার সময় আমি এই সমস্যার মুখোমুখি হয়েছি। আমি কেবল এই নির্ভরশীলতাগুলি যুক্ত করে এটি সমাধান করেছি।

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>

5

একটি ছোট পার্শ্ব নোট - ওয়েব অ্যাপ্লিকেশন বিকাশ করার সময় এই একই ত্রুটিটিকে হোঁচট খাচ্ছে। ফায়ারফক্স পোস্টারের সাথে পরিষেবাটি ব্যবহার করে আমরা যে ভুলটি খুঁজে পেয়েছি তা হ'ল জসনের ক্ষেত্র এবং মান উভয়ই দ্বিগুণ উদ্ধৃতি দ্বারা আবদ্ধ হওয়া উচিত। এই ক্ষেত্রে..

[ {"idProductCategory" : "1" , "description":"Descrizione1"}, 
  {"idProductCategory" : "2" , "description":"Descrizione2"} ]

আমাদের ক্ষেত্রে আমরা জাভাস্ক্রিপ্টের মাধ্যমে জেসনটি পূরণ করেছি, যা আমি শুনেছি তা থেকে একক / ডাবল উদ্ধৃতি নিয়ে কাজ করার ক্ষেত্রে কিছুটা বিভ্রান্তি হতে পারে।

'গ্রহণ করুন' এবং 'বিষয়বস্তু-টাইপ' শিরোনাম সহ এই এবং অন্যান্য পোস্টে এর আগে যা বলা হয়েছিল সেগুলিও প্রযোজ্য।

আশা করি।


3

কীভাবে এটি কাজ করে তা আমি পরিচালনা করেছিলাম। আমি ভুল হলে আমাকে বলুন। সিরিয়ালাইজেশন / ডেসিরিয়ালাইজ করার জন্য আমি কেবল একটি উপায় ব্যবহার করেছি: আমি ক্লাসে এই ( @JSONSerializeএবং @JSONDeserialize) এবং নিবন্ধিত সিরিয়ালাইজার এবং ডিসরিওলাইজার সম্পর্কিত সমস্ত টীকা সরিয়েছি CustomObjectMapper। আমি এই আচরণটি ব্যাখ্যা করার জন্য একটি নিবন্ধ পাইনি তবে আমি এইভাবে সমাধান করেছি। আশা করি এটি কার্যকর।


আমার সাথে একই ঘটে! কোন ব্যাখ্যা কেন এমন হয়?
হিংসাত্মক

আপনি কি দয়া করে আপনার পদ্ধতিটি বিস্তারিতভাবে ব্যাখ্যা করতে পারেন ??
দিপংশু ভার্মা

1

আমারও একই সমস্যা ছিল। সমস্যা সমাধানের জন্য আমাকে এই পদক্ষেপগুলি অনুসরণ করতে হয়েছিল:

1. আপনার নিম্নলিখিত নির্ভরতা আছে তা নিশ্চিত করুন:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>

2. নিম্নলিখিত ফিল্টার তৈরি করুন:

    public class CORSFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {

            String origin = request.getHeader("origin");
            origin = (origin == null || origin.equals("")) ? "null" : origin;
            response.addHeader("Access-Control-Allow-Origin", origin);
            response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS");
            response.addHeader("Access-Control-Allow-Credentials", "true");
            response.addHeader("Access-Control-Allow-Headers",
                    "Authorization, origin, content-type, accept, x-requested-with");

            filterChain.doFilter(request, response);
        }
    }

৩. ওয়েব.এক্সএমএল অনুরোধগুলির জন্য উপরের ফিল্টারটি প্রয়োগ করুন

    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.your.package.CORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

আমি আশা করি এটি কারও পক্ষে কার্যকর হবে।


jackson-coreএকটি হল নির্ভরতা এর jackson-databind, তাই এটি সরাসরি যোগ করার জন্য কোন প্রয়োজন নেই।
অ্যালেক্স 78191

1
কেন এটি সিওআরএস ফিল্টার যুক্ত করা প্রয়োজন?
অ্যালেক্স 78191

1

স্প্রিং বুট + বসন্ত এমভিএন

ইস্যু সহ

@PostMapping("/addDonation")
public String addDonation(@RequestBody DonatorDTO donatorDTO) {

সমাধান সহ

@RequestMapping(value = "/addDonation", method = RequestMethod.POST)
@ResponseBody
public GenericResponse addDonation(final DonatorDTO donatorDTO, final HttpServletRequest request){

0

আমি আমার পোমে জ্যাকসন-জসন ডেটা বাঁধাই করে এই সমস্যাটি সমাধান করেছি।

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
</dependency>

0

আপনার মডেল ক্লাসে একটি জসন সম্পত্তি এনোটোটেশন যুক্ত করুন, একটি ডিফল্ট কনস্ট্রাক্টরও থাকুন

@JsonProperty("user_name")
private String userName;

@JsonProperty("first_name")
private String firstName;

@JsonProperty("last_name")
private String lastName;

0

আমারো একই ইস্যু ছিল. যোগ

<mvc:annotation-driven />
<mvc:default-servlet-handler />

বসন্ত-এক্সএমএল এটি সমাধান করেছে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.